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
限定符 的情况下读取着色器实例写入的值
没有其他着色器实例写入 image/buffer 中的特定位置。
您正在通过相同的image/buffer变量读回您写入的值。两个单独的 image/buffer 变量可以引用相同的内存地址(将相同的 image/buffer 绑定到不同的变量)。但是实现不需要通过不同的变量来缓存对同一内存的访问。
可以在图像变量上使用 restrict
限定符来明确表示是这种情况。事实上,人们应该默认使用 restrict
,除非他们明确打算通过多个对象访问同一内存。
我知道在同一分派的不同调用中使用 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
限定符 的情况下读取着色器实例写入的值
没有其他着色器实例写入 image/buffer 中的特定位置。
您正在通过相同的image/buffer变量读回您写入的值。两个单独的 image/buffer 变量可以引用相同的内存地址(将相同的 image/buffer 绑定到不同的变量)。但是实现不需要通过不同的变量来缓存对同一内存的访问。
可以在图像变量上使用
restrict
限定符来明确表示是这种情况。事实上,人们应该默认使用restrict
,除非他们明确打算通过多个对象访问同一内存。