glslLangValidator多个预处理器替换

问题描述

我想使用以下着色器中的宏访问统一的块实例成员:

#version 450 core

layout(std140,set=0,binding=0) uniform UBlock {
    float value;
} uInstance;
#define value uInstance.value

#define saturate(X) clamp( X,1 )

layout(location = 0) out float Out;

void main ()
{
    Out = value;
    Out = saturate(value);
}

但是每当我将重新定义的符号传递给另一个宏时,glsllangValidator都会返回以下错误

ERROR: D:/shader_translation/glsl_preprocessor.frag:15: 'uInstance' : no such field in structure
ERROR: D:/shader_translation/glsl_preprocessor.frag:15: '' : compilation terminated
ERROR: 2 compilation errors.  No code generated.

有没有办法使这项工作有效? 它适用于cpp: (https://onlinegdb.com/SJ-B3A8tP

解决方法

可以从value结构外部访问uInstance变量,而不必指定uInstance.*。也就是说,您不必#define,只需使用value。它似乎也在干扰#define,就好像您对其重命名一样-它可以正常工作(至少对我而言)。

,

这里的问题是glsl中宏的工作方式。通过将value定义为uInstance.value,GLSL预处理器还将替换uInstance.value中的值,得到uInstance.uinstance.value。这也是错误消息所指的。

例如将着色器更改为

#version 450 core

layout(std140,set=0,binding=0) uniform UBlock {
    float value;
} uInstance;

#define val uInstance.value

#define saturate(X) clamp( X,1 )

layout(location = 0) out float Out;

void main ()
{
    Out = val;
    Out = saturate(val);
}

它可以在Vulkan目标环境中很好地编译。