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'
顺便说一下
- C++预处理器编译没有问题
- 宏连接在其他 hlsl 代码中工作正常。
如果有人能解释我的错误,我会很高兴,因为我相信我的宏是根据 documentation...
编写的
问题可能出在 fxc.exe(效果器编译工具)中预处理器的错误实现。
可能的解决方案是将 Visual Studio 手动配置为
- 使用 C++ 编译器预处理文件
cl.exe file /P [other option] /FipreprocessedFile
- 然后用效果编译工具编译
fxc.exe preprocessedFile [options]
嗯,这不是 Microsoft 的 HLSL 实现中的错误。实际上 HLSL 处理器的工作方式不同(很遗憾)。有关详细信息,请参阅下面的 link。
作为解决方法,您可以使用预处理库(我使用 fcpp,它工作正常)在将代码传递给 HLSL 编译器之前对其进行预处理。
我在 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'
顺便说一下
- C++预处理器编译没有问题
- 宏连接在其他 hlsl 代码中工作正常。
如果有人能解释我的错误,我会很高兴,因为我相信我的宏是根据 documentation...
编写的问题可能出在 fxc.exe(效果器编译工具)中预处理器的错误实现。
可能的解决方案是将 Visual Studio 手动配置为
- 使用 C++ 编译器预处理文件
cl.exe file /P [other option] /FipreprocessedFile
- 然后用效果编译工具编译
fxc.exe preprocessedFile [options]
嗯,这不是 Microsoft 的 HLSL 实现中的错误。实际上 HLSL 处理器的工作方式不同(很遗憾)。有关详细信息,请参阅下面的 link。
作为解决方法,您可以使用预处理库(我使用 fcpp,它工作正常)在将代码传递给 HLSL 编译器之前对其进行预处理。