我在Unity项目中用HLSL实现宏的时候遇到了一个奇怪的问题。
#define read(name) read2(TYPEOF(name), name)
#define TYPEOF(name) typeof_ ## name
#define read2(t, name) TYPEOF_READ(t, name)
#define TYPEOF_READ(a, b) a ## _read(b)
#define typeof_X float
read(X);
我预计这会像下面这样扩展。
float_read(X);
但是Unity说
Undeclared identifier 'typeof_X_read'.
HLSL/Cg 预处理器与通用 C 之一之间是否存在一些实现差异? 我当然查过了
gcc -E
像我预期的那样工作。
最佳答案
不幸的是,这是因为 HLSL 预处理器做的一些事情与 C 预处理器不同:https://msdn.microsoft.com/en-us/library/windows/desktop/dd607345%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
编辑: 在这种情况下,它似乎可能是一个编译器错误。宏可以正确展开并可以在此处进行测试:https://tryhlsl.azurewebsites.net/
#define read(name) read2(TYPEOF(name), name)
#define TYPEOF(name) typeof_ ## name
#define read2(t, name) TYPEOF_READ(t, name)
#define TYPEOF_READ(a, b) a ## _read(b)
#define typeof_X float
void float_read(float) {}
struct PSInput
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
PSInput VSMain(float4 position : POSITION, float4 color : COLOR)
{
float X;
read(X);
PSInput result;
return result;
}
float4 PSMain(PSInput input) : SV_TARGET
{
return input.color;
}
关于c++ - Unity 的 HLSL/Cg 预处理器工作方式不对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713944/