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