【问题标题】:HLSL preprocessor in Visual Studio 2015Visual Studio 2015 中的 HLSL 预处理器
【发布时间】:2016-12-06 18:40:39
【问题描述】:

我正在 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...

【问题讨论】:

    标签: visual-studio-2015 hlsl


    【解决方案1】:

    问题可能是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

    【讨论】:

    • 有人可以确认吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 这是错误(在 MSDN 上已确认),是的,此预处理器的工作方式与标准 c++ 预处理器不同。所描述的例子没有超出 HLSL 预处理器的规范,即使它失败了,因此它可以被认为是错误......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多