glsl imageStore,其次是imageLoad,是否连贯?

glsl imageStore, followed by imageLoad, is it coherent?

我知道在同一分派的不同调用中使用 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,即使没有coherent关键字?

只要:

,您始终可以在没有 coherent 限定符 的情况下读取着色器实例写入的值
  1. 没有其他着色器实例写入 image/buffer 中的特定位置。

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

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