我正在尝试OpenGL 4.5中的ARB_fragment_shader_interlock扩展,并且在尝试使用pixel_interlock_ordered时无法编译着色器。
#version 430
#extension GL_ARB_shading_language_420pack : require
#extension GL_ARB_shader_image_load_store : require
#extension GL_ARB_fragment_shader_interlock : require
layout(location = 0, rg8, pixel_interlock_ordered) uniform image2D image1;
void main()
{
beginInvocationInterlockARB();
ivec2 coords = ivec2(gl_FragCoord.xy);
vec4 pixel = imageLoad(image1, coords);
pixel.g = pixel.g + 0.01;
if (pixel.g > 0.5)
pixel.r = pixel.r + 0.01;
else
pixel.r = pixel.r + 0.02;
imageStore(image1, coords, pixel);
endInvocationInterlockARB();
}
以下着色器编译失败:
0(6) : error C7600: no value specified for layout qualifier 'pixel_interlock_ordered'
对于任何随机名称,而不是pixel_interlock_ordered,您都会遇到相同的错误。我猜想语法会有所不同,但是规范(https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_fragment_shader_interlock.txt)将其称为“布局限定符”。
谷歌搜索“ pixel_interlock_ordered”很短,只是指向官方规格的链接,所以我找不到一个例子。正确的语法是什么?
答案 0 :(得分:2)
Layout qualifiers有点奇怪。它们通常适用于声明,但其中某些有效地整体上适用于着色器。这些限定符基本上是您在着色器中设置的shader-specific options。
互锁限定符是那些类型的限定符。您并不是说将通过互锁访问此变量,因为这不是互锁的意思。这意味着相对于在同一着色器的其他调用上执行联锁代码,联锁代码的执行将具有一定的属性。限定符指定执行限制的详细信息。
整个应用于着色器的限定符在in
或out
上被语法指定为限定符(大多数此类限定符使用in
,但少数使用out
) :
layout(pixel_interlock_ordered) in;