Opengl imageAtomicCompSwap文档和使用

Opengl imageAtomicCompSwap文档和使用,opengl,glsl,Opengl,Glsl,我正在尝试使用着色器互斥体的整数纹理实现深度剥离算法。正如中所建议的,我怀疑可以使用imageAtomicCompSwap(…) 查找该函数,并为无符号整数选择重载: uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data); 然而,目前尚不清楚如何使用这一点。文件内容如下: imageAtomicCompSwap以原子方式将数据值与坐标p处的纹理值进行比较。如果值相等,数据将存储到texel中,否则将被丢弃。它返回texel的新

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

查找该函数,并为无符号整数选择重载:

uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data);
然而,目前尚不清楚如何使用这一点。文件内容如下:

imageAtomicCompSwap以原子方式将数据值与坐标p处的纹理值进行比较。如果值相等,数据将存储到texel中,否则将被丢弃。它返回texel的新值

这听起来像是函数将数据与texel中已经存在的值进行比较。如果值相等,实际上什么也不会发生(“数据存储到texel中”,但它们比较相等,所以没有变化)。如果值不相等,则不会发生任何事情(“否则将丢弃它”)。然后,该函数返回texel的新值(因为这两种方式都没有发生任何事情,所以它只是texel的原始值)。很明显,我遗漏了一些东西

使事情复杂化的是,我甚至还没能让这个函数出现。写作:

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

0(14):错误C1115:找不到兼容的重载函数“imageAtomicCompSwap(结构uimage2D1x32,ivec2,uint)”

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

imageAtomicCompSwap(img2D_0,coord,1u,1u);
它编译得很好——我知道这只适用于多重采样;我是否以某种方式声明了多采样图像?那么,A:文档是什么意思,B:为什么我需要的函数不能工作?我很困惑

在文档中查找该函数

老兄,那些网页造成的问题比它们解决的问题还多

简言之,这些文件都被破坏了。规范(即:重要文件)规定功能定义如下:

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)
其中,
IMAGE_PARAMS
是图像均匀性和适合该图像的纹理坐标。对于1D图像,它采用
image1D
int
;对于2D图像,它采用
image2D
ivec2
;等等


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

注意:我对此提交了一份错误报告,但考虑到ARB在响应错误报告方面有多么糟糕,我不会屏住呼吸。谢谢。我不确定自旋锁将如何工作。在我看来,按照您的建议,将“比较”设置为0,将“数据”设置为1,将始终返回1(如果纹理中的值为0,则交换,返回新值1;如果纹理中的值为1,则不交换,返回原始值1)?根据规范“原子内存操作从选定的texel读取一个值,使用下面描述的操作之一计算一个新值,将新值写入选定的texel,并返回读取的原始值。”--不是交换后的值。请参阅第155页