imageAtomic GLSL函数和RGBA图像格式

imageAtomic GLSL函数和RGBA图像格式,glsl,opengl-4,Glsl,Opengl 4,我有一个应用程序,其中我使用使用glBindImageTexture绑定的纹理缓冲区,我的GLSL代码执行各种操作并更新缓冲区 最近,我将一些图像缓冲区格式从GL_R32UI更改为GL_RGBA32UI。基本上,一个texel之前是1个无符号整数,现在是4个无符号整数。在进行imageStores、imageLoads和客户端操作时,一切都很正常 我目前在使用imageAtomic*函数时遇到一些问题。 让我们用原子加法拍照。最后一个参数始终为整数大小,与缓冲区格式无关。它不是uvec4,仍然是

我有一个应用程序,其中我使用使用glBindImageTexture绑定的纹理缓冲区,我的GLSL代码执行各种操作并更新缓冲区

最近,我将一些图像缓冲区格式从GL_R32UI更改为GL_RGBA32UI。基本上,一个texel之前是1个无符号整数,现在是4个无符号整数。在进行imageStores、imageLoads和客户端操作时,一切都很正常

我目前在使用imageAtomic*函数时遇到一些问题。 让我们用原子加法拍照。最后一个参数始终为整数大小,与缓冲区格式无关。它不是uvec4,仍然是一个单元。 当我调用imageAtomicAdd(一些图像缓冲区,一些地址,1u)时,到底应该发生什么? GLSL会增加所有4个texel组件(x、y、z和w),还是只增加一个?哪一个

谢谢你的洞察力

GLSL会增加所有4个texel组件(x、y、z和w),还是只增加一个?哪一个

都不是;这是绝对不允许的。根据规范:

仅在所有图像变量类型的子集上支持原子内存操作;图像必须是:

  • 有符号整数图像变量(类型以“iimage”开头)和格式限定符
    r32i
    ,与
    int
    类型的数据参数一起使用,或
  • 无符号图像变量(类型以“uimage”开头)和格式限定符
    r32ui
    ,与
    uint
    类型的数据参数一起使用

非常感谢。难怪我的代码完全是假的。如果我想在vec4的基础上访问东西,以及原子化地修改vec4的各个组件,SSBO似乎是一个不错的选择。马丁·弗兰克:事实上,在做出这样的声明之前,你应该先检查一下。因为SSBO原子操作也不会作用于向量。您无法执行SIMD原子操作。如果我信任此OpenGL网站页面,则它们可以作用于单个向量组件:。“原子操作”部分:引用:“这些操作仅在uint上运行​ 或int​ 类型,但它们可以是聚合的成员(结构/数组)**或向量元素(即:您可以原子地访问uvec3.x)**​)". 你是说这个网页不正确吗?@MartinFrank:不,我是说你不能做
atomicAdd(someVec,someOtherVec)
。对4个值执行4个原子操作与对4个值执行单个原子操作非常不同。后者是不可能的。好的。我们在同一条线上。再次感谢你的帮助。