我正在尝试使用整形纹理为着色器互斥体实现深度剥离算法。正如this question中所建议的,我怀疑可以使用imageAtomicCompSwap(...)。
在the documentation中查找该函数,并选择无符号整数的重载:
uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data);
但是,目前还不清楚如何使用它。文档内容如下:
imageAtomicCompSwap原子地将数据的值与坐标P处的纹素的值进行比较。 。 。 。如果值相等,则将数据存储到纹理元素中,否则将其丢弃。它返回纹素的新值。
这听起来像函数将数据与texel中已存在的值进行比较。如果值相等,实际上没有任何反应(“数据存储在纹素中”,但它们相等,所以没有变化)。如果值不相等,则不会发生任何事情(“否则它将被丢弃”)。然后该函数返回texel的新值(因为没有任何一种方式发生,只是开始时texel的原始值)。显然我错过了一些东西。
使问题复杂化,我也无法让这个功能出现。写作:
//img2D_0 is declared "layout(r32ui) coherent restrict uniform uimage2D img2D_0"
imageAtomicCompSwap(img2D_0,coord,1u);
。 。 。给出:
0(14):错误C1115:无法找到兼容的重载函数“imageAtomicCompSwap(struct uimage2D1x32,ivec2,uint)”
值得一提的是,如果我传递两个数字:
imageAtomicCompSwap(img2D_0,coord,1u,1u);
它编译得很好 - 我知道这应该仅适用于多重采样;我以某种方式声明了一个多重采样的图像吗?那么,A:文档是什么意思,B:为什么我需要的功能不起作用?我很困惑。
答案 0 :(得分:2)
查看该功能的文档
伙计,那些引起的问题比他们解决的问题更多......
简而言之,文档被打破了。 规范(即:重要的文档)声明该函数定义为:
uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)
其中IMAGE_PARAMS
是图像均匀的,并且适合该图像的纹理坐标是均匀的。对于一维图像,需要image1D
和int
;对于2D图像,需要image2D
和ivec2
;等
它的工作原理是将图像中的值与compare
进行比较。如果它们相等,则data
存储在此位置(交换);否则,不进行交换。返回值将是在条件交换完成之前存储在此位置的任何值。