opengl - imageAtomicCompSwap 文档和使用

标签 opengl glsl

我正在尝试使用着色器互斥体的整数纹理来实现深度剥离算法。正如 this question 中所建议的,我怀疑可以使用 imageAtomicCompSwap(...)。

查看the documentation对于该函数,并选择无符号整数的重载:

uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data);

但是,尚不清楚如何使用它。文档内容如下:

imageAtomicCompSwap atomically compares the value of data with that of the texel at coordinate P . . . . If the values are equal, data is stored into the texel, otherwise it is discarded. It returns the new value of the texel.

这听起来像是该函数将数据与纹素中已有的值进行比较。如果值相等,则实际上什么也不会发生(“数据存储到纹素中”,但它们比较相等,因此没有变化)。如果值不相等,则不会发生任何情况(“否则将被丢弃”)。然后,该函数返回纹理元素的新值(因为无论如何都没有发生任何事情,所以它只是纹理元素的原始值)。显然我错过了一些东西。

让事情变得更复杂的是,我还无法让这个功能显示出来。写作:

//img2D_0 is declared "layout(r32ui) coherent restrict uniform uimage2D img2D_0"
imageAtomicCompSwap(img2D_0,coord,1u);

。 。 。给出:

0(14) : error C1115: unable to find compatible overloaded function "imageAtomicCompSwap(struct uimage2D1x32, ivec2, uint)"

值得一提的是,如果我传递两个数字:

imageAtomicCompSwap(img2D_0,coord,1u,1u);

它编译得很好——不过,我知道这只适用于多重采样;我是否以某种方式声明了多重采样图像?那么,A:文档是什么意思,B:为什么我需要的功能不起作用?我很困惑。

最佳答案

Looking in the documentation for that function

伙计,那些页面引起的问题比它们解决的问题还要多......

简而言之,文档已损坏。 规范(即:重要的文档)声明该函数定义为:

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)

其中IMAGE_PARAMS是图像制服和适合该图像制服的纹理坐标。对于一维图像,它需要一个 image1D 和一个 int;对于 2D 图像,它需要一个 image2D 和一个 ivec2;等等

它的工作原理是使用compare比较图像中的值。如果它们相等,则 data 存储在该位置(交换);否则,不会进行交换。返回值将是条件交换完成之前存储在此位置的任何值。

关于opengl - imageAtomicCompSwap 文档和使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11808604/

相关文章:

linux - glxinfo: OpenGL 渲染器字符串::Chromium

android - GPU中的亮度直方图计算-android opengl es 3.0

c++ - 如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵

c++ - OpenCL/OpenGL 互操作性纹理段错误

c++ - OpenGL 不会绘制我的四边形

opengl - 如何在立方体上获得平坦的法线

javascript - WebGL/GLSL - ShaderToy 是如何工作的?

来自模型 View 矩阵的 openGL 位置和方向

c++ - 奇怪的 OpenGL 片段着色器行为与 gl_PointCoord

image - 如何写入纹理缓冲区对象?