我正在尝试使用整数纹理为着色器互斥体实现深度剥离算法。正如这个问题所建议的,我怀疑可以使用 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:为什么我需要的功能不起作用?我很困惑。