Visual Studio 2015 年的 HLSL 预处理器

HLSL preprocessor in Visual Studio 2015

我在 Visual Studio 2015 年处理 DirectX 着色器和 C++ 代码,我只想编写一个代码,所以我开始使用宏,因为我认为这是统一代码的有效方法.

visual studio 中的 HLSL 预处理器与 C++ 预处理器略有不同,例如它不支持可变参数宏;另一方面,基本工作是相同的(参见 documentation)。

我的问题是,当我使用以下代码时:

STATIC_TRAITS_DECLARATION SimpleVertexDefinition(PARSER_MEMORY, CONTEXT_MEMORY)

其中所有项SimpleVertexDefinitions,STATIC_TRAITS_DECLARATION,CONTEXT_MEMORY,PARSER_MEMORY是宏,一切正常。但是当我尝试通过宏

来定义它时
#define DECLARE_VERTEX_SHADER_INPUT(type) STATIC_TRAITS_DECLARATION type##Definition(PARSER_MEMORY, CONTEXT_MEMORY)

DECLARE_VERTEX_SHADER_INPUT(SimpleVertex)

我明白了

Error   X1516   not enough actual parameters for macro 'SimpleVertexDefinition' 
Error   X3000   unrecognized identifier 'SimpleVertexDefinition'    

顺便说一下

如果有人能解释我的错误,我会很高兴,因为我相信我的宏是根据 documentation...

编写的

问题可能出在 fxc.exe(效果器编译工具)中预处理器的错误实现。

可能的解决方案是将 Visual Studio 手动配置为

  • 使用 C++ 编译器预处理文件 cl.exe file /P [other option] /FipreprocessedFile
  • 然后用效果编译工具编译fxc.exe preprocessedFile [options]

https://social.msdn.microsoft.com/Forums/en-US/b6ccd269-8ef4-4b80-b575-da58894a71ee/hlsl-preprocessor-in-visual-studio-2015?forum=vclanguage

嗯,这不是 Microsoft 的 HLSL 实现中的错误。实际上 HLSL 处理器的工作方式不同(很遗憾)。有关详细信息,请参阅下面的 link。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd607345%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

作为解决方法,您可以使用预处理库(我使用 fcpp,它工作正常)在将代码传递给 HLSL 编译器之前对其进行预处理。