Visual studio 2015 Visual Studio 2015中的HLSL预处理器 我在VisualStudio 2015中对DirectX着色器和C++代码工作,我想只做一个代码,所以我开始玩宏,因为我认为它是如何统一代码的有效方法。 VisualStudio中的P> > HLSL预处理器与C++预处理器有点不同,例如它不支持变量宏;另一方面,基础工作也是一样的(参见)

Visual studio 2015 Visual Studio 2015中的HLSL预处理器 我在VisualStudio 2015中对DirectX着色器和C++代码工作,我想只做一个代码,所以我开始玩宏,因为我认为它是如何统一代码的有效方法。 VisualStudio中的P> > HLSL预处理器与C++预处理器有点不同,例如它不支持变量宏;另一方面,基础工作也是一样的(参见),visual-studio-2015,hlsl,Visual Studio 2015,Hlsl,我的问题是,当我使用以下代码时: STATIC_TRAITS_DECLARATION SimpleVertexDefinition(PARSER_MEMORY, CONTEXT_MEMORY) 当所有的术语(SimpleVertexDefinitions、静态特征声明、上下文内存、解析器内存)都是宏时,一切正常。但当我试图通过以下宏来定义它时 #define DECLARE_VERTEX_SHADER_INPUT(type) STATIC_TRAITS_DECLARATION type##De

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

STATIC_TRAITS_DECLARATION SimpleVertexDefinition(PARSER_MEMORY, CONTEXT_MEMORY)
所有的术语(SimpleVertexDefinitions、静态特征声明、上下文内存、解析器内存)都是宏时,一切正常。但当我试图通过以下宏来定义它时

#define DECLARE_VERTEX_SHADER_INPUT(type) STATIC_TRAITS_DECLARATION type##Definition(PARSER_MEMORY, CONTEXT_MEMORY)

DECLARE_VERTEX_SHADER_INPUT(SimpleVertex)
我明白了

顺便说一下

  • C++预处理器编译它没有问题
  • 宏串联在其他hlsl代码中工作良好

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

问题可能是在fxc.exe(effect compiler tool)中错误地实现了预处理器

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

  • 用C++编译器预处理文件<代码> C.exe文件/P[其他选项] / FiPrPraceStudio< <代码>
  • 然后使用effect编译器工具编译它
    fxc.exe预处理文件[选项]

这不是微软HLSL实现中的一个bug。实际上,HLSL处理器的工作方式不同(这是一个遗憾)。有关更多详细信息,请参阅下面的链接


作为一个解决方案,您可以使用预处理库(我使用FCPP,它工作正常),在将代码传递给HLSL编译器之前预处理它。< / P>有人能确认它吗?它是BUG(如MSDN上确认的),是的,这个预处理器的工作方式与标准C++预处理器不同。所描述的例子并没有超出HLSL预处理器的规格,即使它失败了,也可以认为是错误。。。

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