Glsl imageLoad和imageStore似乎未定义

Glsl imageLoad和imageStore似乎未定义,glsl,Glsl,我正在使用OpenGL4.2中的原子纹理实现单遍深度剥离算法。我编写了以下片段程序: #version 420 core layout(r32i) coherent uniform iimage2D img2D_0; uniform iimage2D img2D_1; in vec3 pos; vec4 insert(vec4 data, float new_data) { if (new_data<data.x) return vec4( new_data,d

我正在使用OpenGL4.2中的原子纹理实现单遍深度剥离算法。我编写了以下片段程序:

#version 420 core
layout(r32i) coherent uniform iimage2D img2D_0;
uniform iimage2D img2D_1;
in vec3 pos;
vec4 insert(vec4 data, float new_data) {
    if      (new_data<data.x) return vec4(      new_data,data.xyz);
    else if (new_data<data.y) return vec4(data.x,new_data,data.yz);
    else if (new_data<data.z) return vec4(data.xy,new_data,data.z);
    else if (new_data<data.w) return vec4(data.xyz,new_data      );
    else                      return data;
}
void main() {
    ivec2 coord = ivec2(gl_FragCoord.xy);
    while (imageAtomicCompSwap(img2D_0,coord,0,1)==1);
    vec4 depths = imageLoad(img2D_1,coord);
    depths = insert(depths,gl_FragCoord.z);
    imageStore(img2D_1,coord,depths);
    memoryBarrier();
    imageAtomicExchange(img2D_0,coord,0);
}
我注意到我在着色器中使用了#version 420,我在文档(,)中检查了函数的声明,它们似乎匹配。奇怪的是,imageAtomicCompSwap、memoryBarrier和imageAtomicExchange似乎已经定义好了。为什么会出现这些错误

uniform iimage2D img2D_1;

这不是有效的图像定义。您必须使用
layout()
定义其图像格式,除非您已将其声明为
writeonly
。它应该在这一行出错,但它将其解释为某种结构定义。因此,当您尝试使用它时,它会出错。

谢谢;我将其更改为“layout(RGBA32F)uniform image2D”,并进行编译。@IanMallett:BTW,您可能希望将错误作为驱动程序错误提交给NVIDIA或AMD。他们应该清除错误消息,使其更加明显。
uniform iimage2D img2D_1;