我有一个应用程序,我使用glBindImageTexture绑定纹理缓冲区,我的GLSL代码执行各种操作并更新缓冲区。
最近我将一些图像缓冲区格式从GL_R32UI更改为GL_RGBA32UI。所以基本上,一个texel之前是1 unsigned int,现在它是4个无符号整数。在进行imageStores,imageLoads和客户端事务时,一切正常。
我在使用imageAtomic *函数时遇到了一些问题。 我们来看imageAtomicAdd。无论缓冲区格式如何,最后一个参数始终为整数大小。例如。它不是一个uvec4,而且只是一个单一的uint。 当我调用imageAtomicAdd(some_uimageBuffer,some_address,1u)时,应该发生什么? GLSL会增加所有4个texel组件(x,y,z和w),还是只增加一个?哪一个?
感谢您的见解!
答案 0 :(得分:2)
GLSL会增加所有4个纹素组件(x,y,z和w),还是只增加一个?哪一个?
既不;根本不允许。从规范:
仅所有图像变量类型的子集支持原子内存操作;图片必须是:
- 有符号整数图像变量(类型以“iimage”开头)和格式限定符
r32i
,与int
类型的数据参数一起使用,或- 无符号图像变量(类型以“uimage”开头)和格式限定符
r32ui
,与uint
类型的数据参数一起使用。