代码之家  ›  专栏  ›  技术社区  ›  geometrian

imageAtomicCompSwap文档和使用

  •  2
  • geometrian  · 技术社区  · 12 年前

    我正在尝试使用整数纹理来实现着色器互斥的深度剥离算法。如中所述 this question ,我怀疑可以使用imageAtomicCompSwap(…)。

    正在查看 the documentation 对于该函数,并为无符号整数选择重载:

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

    然而,目前尚不清楚如何使用它。文件内容如下:

    imageAtomicCompSwap在坐标P处原子地比较数据的值与纹素的值。如果值相等,则数据将存储到纹素中,否则数据将被丢弃。它返回纹素的新值。

    这听起来像是函数将数据与纹素中已经存在的值进行比较。如果这些值相等,实际上什么也不会发生(“数据存储在纹素中”,但它们比较相等,所以没有变化)。如果值不相等,则不会发生任何事情(“否则将丢弃”)。然后,函数返回纹素的新值(因为两种方式都没有发生任何事情,所以它只是纹素的原始值)。很明显我错过了什么。

    更复杂的是,我还没能让这个功能出现。写作:

    //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 回复  |  直到 7 年前
        1
  •  2
  •   Nicol Bolas    12 年前

    查看该函数的文档

    伙计,那些书页 原因 比他们解决的问题更多。。。

    简言之,文档已损坏。这个 规格 (即:重要的文档)指出,函数定义为:

    uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)
    

    哪里 IMAGE_PARAMS 图像是均匀的,并且适合于该图像的纹理坐标是均匀的。对于1D图像,需要 image1D 和一个 int ;对于2D图像,需要 image2D 和一个 ivec2 ;等

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