是否可以使用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,这对我帮助很大。
答案 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方式更灵活。