2

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

查看该函数的文档,并为无符号整数选择重载:

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

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

imageAtomicCompSwap 以原子方式将 data 的值与坐标 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:为什么我需要的功能不起作用?我很困惑。

4

1 回答 1

2

查看该功能的文档

伙计,这些页面造成的问题比解决的问题多……

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

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)

图像统一在哪里IMAGE_PARAMS,适合该图像统一的纹理坐标在哪里。对于一维图像,它需要一个image1D和一个int; 对于 2D 图像,它需要一个image2D和一个ivec2; 等等

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

于 2012-08-04T12:24:58.837 回答