我知道在同一个调度中的不同调用中使用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,即使没有连贯的关键字吗?
答案 0 :(得分:2)
只要 ,您就可以在没有coherent
限定符的情况下读取着色器实例所写的值:
着色器的其他实例没有写入图像/缓冲区中的特定位置。
您正在通过编写的相同的图像/缓冲区变量读取值。两个单独的图像/缓冲区变量可以引用相同的内存地址(将相同的图像/缓冲区绑定到不同的变量)。但是实现不需要通过不同的变量来缓存对同一内存的访问。
可以在图像变量上使用restrict
限定符,以明确这种情况。实际上,人们应该默认使用restrict
,除非他们明确打算通过多个对象访问相同的内存。