glsl imageStore,后面跟着imageLoad,它是连贯的吗?

时间:2015-12-15 15:26:46

标签: opengl glsl textures compute-shader

我知道在同一个调度中的不同调用中使用imageStore并后跟imageRead需要正确读取相关关键字。

但是,我可以在不使用coherent的情况下在相同的调度中读取值吗?

或换句话说,当我有这个时:

layout(r8ui) uniform uimage2D input_texture;
void main(){
  ivec2 coords = ivec2(gl_GlobalInvocationID.xy);
  imageStore(input_texture, coords, ivec4(128));
  int value = imageLoad(input_texture, coords).r;
}

value保证是128,即使没有连贯的关键字吗?

1 个答案:

答案 0 :(得分:2)

只要 ,您就可以在没有coherent限定符的情况下读取着色器实例所写的值:

  1. 着色器的其他实例没有写入图像/缓冲区中的特定位置。

  2. 您正在通过编写的相同的图像/缓冲区变量读取值。两个单独的图像/缓冲区变量可以引用相同的内存地址(将相同的图像/缓冲区绑定到不同的变量)。但是实现不需要通过不同的变量来缓存对同一内存的访问。

    可以在图像变量上使用restrict限定符,以明确这种情况。实际上,人们应该默认使用restrict,除非他们明确打算通过多个对象访问相同的内存。