我想在多个计算着色器中使用imageStoreimageLoad

这与“正常”渲染命令(glDraw)混合到屏幕或帧缓冲区,但这些命令不使用imageStoreimageLoad(仅使用texturetexelFetch)。

我只有一个OpenGL上下文和线程。

我的假设如下:

  • 在执行imageStore时,我需要先在后面的计算着色器中执行glMemoryBarrier或在以后的片段着色器中进行imageLoadtexture,然后再执行texelFetch
  • 我根本不需要使用coherent
  • 我根本不需要使用glSync
  • 使用帧缓冲区写入纹理后,然后使用glMemoryBarrier读取它,不需要使用imageLoad
  • OpenGL将按请求的顺序运行计算着色器和“常规”绘制操作。假设在两次调用之间使用glMemoryBarrier,则没有“线程问题”。

  • 他们正确吗?

    最佳答案

    所有这些都是正确的,但“可能”除外:



    您可能需要coherent,具体取决于您的计算着色器正在做什么。如果您的计算着色器写入图像,然后从另一个invocation within the same dispatch写入的数据中读取,则需要coherent。因此,如果执行imageStore,发出计算着色器barrier()调用,然后执行imageLoad来读取其他invocation的值,那么您需要coherent限定符。
    coherent是关于确保visibility within a rendering command(在OpenGL中将CS分派(dispatch)视为“渲染命令”)。如果您不需要内部可见性,那么就不需要coherent

    我想对此进行详细说明,因为这是造成混淆的常见原因:



    这是绝对正确的。内存障碍是关于确保对内存的不连贯写入的可见性(和同步性)。渲染到帧缓冲区不是不连贯的写入。因此,您可以在此类数据上使用imageLoad,而无需显式同步。

    当然假设您不是rendering to that framebuffer in the same operation you're imageLoad ing from it。该规则仍然适用。

    关于c++ - 计算着色器和imageStore的内存一致性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34069961/

    10-16 01:42