如何使用C ++中的D3DCompile()定义类似函数的宏?

时间:2014-09-07 23:50:54

标签: c++ macros hlsl directx-11

是否可以使用D3DCompile()const D3D_SHADER_MACRO *pDefines参数定义类似函数的宏?

可悲的是,MSDN不是非常具体,但暗示可以使用 fxc.exe / D 选项定义它们。


我试过这个:

const D3D_SHADER_MACRO dx11Defines[] = {
    {"SIMPLE_MACRO", "42"},
    {"FUNCTION_MACRO(x)", "DoSometing((x).somefield)"},
    {nullptr, nullptr},
};

在HLSL中使用:

float test1 = SIMPLE_MACRO;
float test2 = FUNCTION_MACRO(data);

但编译失败了:

Test.fx(XX,XX-XX): error X3004: undeclared identifier 'FUNCTION_MACRO'

D3DPreprocess()的输出:

float test1 = 42 ;
float test2 = FUNCTION_MACRO ( data ) ;

[编辑]

我使用相同的HLSL代码测试了以下命令行:

fxc dtest.fx /Ptest_p.fx /D"SIMPLE_MACRO=42" /D"FUNCTION_MACRO(data)=24"

哪个输出:

float test1 = 42 ;
float test2 = FUNCTION_MACRO ( data ) ;

[编辑]

我终于通过使用ID3DInclude接口解决了这个问题,正如@catflier所建议的那样。 当被要求输入特定的头文件名时,我在临时缓冲区中生成类似函数的宏定义。

我偶然发现了a nice article by Adam Sawicki,这对我帮助很大。

1 个答案:

答案 0 :(得分:1)

使用特殊字符定义仅在hlsl中定义时才有效。

所以:FUNCTION_MACRO(x)不会被预处理器替换。

或者您可以使用Include处理程序,因此在文件的开头添加:

#include <myfunction.fxh>

然后在你注入的处理程序中(简单示例):

#define FUNCTION_MACRO(data) sin(data)

要构建处理程序,您可以查看此link

这很简单,你实现open方法,检查包含名称是否与你的匹配,并从那里注入define。

在d3dcompile方法中,您发送include实例,以便调用open方法。

如果你想保持简单,你也可以在代码开头之前手动添加define来调用compile,我发现在很多情况下,include方式更灵活。