c++ - Unity 的 HLSL/Cg 预处理器工作方式不对?

标签 c++ c unity3d hlsl preprocessor

我在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/

相关文章:

c++ - 在 C++ 头文件中放置 using 指令的位置

c++ - "vector of objects"与 "vector of Object pointers"的大小

c++ - wait()等待进程是否消耗系统CPU

c - 从 Rust 到 C 的原始指针变为空

c# - 将许多变量从 Unity 发送到 Arduino

c++ - 无法在 C++ 中使用类实例

c++ - 具有 C++ 性能问题/滞后峰值的 Lua

c - 这是将数组从函数传回 main 的正确方法吗

c# - Unity动态加载和添加动画 Controller

c# - Unity3d - 如何有效地从属于另一个游戏对象的另一个类调用方法