问题描述
我想使用以下着色器中的宏访问统一的块实例成员:
#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目标环境中很好地编译。