[英]How to define a function-like macro with D3DCompile() from C++?
是否可以使用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所建议的那样。 当询问特定的头文件名时,我在临时缓冲区中生成类似函数的宏定义。
我偶然发现了Adam Sawicki的一篇很好的文章 ,这对我帮助很大。
使用特殊字符定义仅在hlsl中定义时才起作用。
所以:FUNCTION_MACRO(x)不会被预处理器替换。
或者,您可以使用Include处理程序,因此在文件的开头添加:
#include <myfunction.fxh>
然后在你注入的处理程序中(简单示例):
#define FUNCTION_MACRO(data) sin(data)
要构建一个处理程序,您可以查看此链接
这很简单,你实现open方法,检查包含名称是否与你的匹配,并从那里注入define。
在d3dcompile方法中,您发送include的实例,以便调用open方法。
如果你想保持简单,你也可以在代码开头之前手动添加define来调用compile,我发现include方式在很多情况下更灵活一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.