当我在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说



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/

10-11 16:11