繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM