imageAtomicCompSwap文档和使用

时间:2012-08-04 12:17:11

标签: opengl glsl

我正在尝试使用整形纹理为着色器互斥体实现深度剥离算法。正如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:为什么我需要的功能不起作用?我很困惑。

1 个答案:

答案 0 :(得分:2)

  

查看该功能的文档

伙计,那些引起的问题比他们解决的问题更多......

简而言之,文档被打破了。 规范(即:重要的文档)声明该函数定义为:

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)

其中IMAGE_PARAMS是图像均匀的,并且适合该图像的纹理坐标是均匀的。对于一维图像,需要image1Dint;对于2D图像,需要image2Divec2;等

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