与计算着色器和 imageStore 的内存一致性

Memory coherency with compute shaders and imageStore

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

这与 "normal" 渲染命令 (glDraw) 混合到屏幕或帧缓冲区,但这些不使用 imageStoreimageLoad(仅 texturetexelFetch).

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

我的假设如下:

他们正确吗?

除了“'possible'”之外,每个都是正确的:

I don't need to use coherent at all.

您可能需要 coherent,具体取决于您的计算着色器正在做什么。如果您的计算着色器写入图像,然后从另一个 invocation within the same dispatch, then you need coherent. So if you do an imageStore, issue a compute shader barrier() call, then do an imageLoad to read some other invocation 的值写入的数据中读取,那么您需要 coherent 限定符。

coherent 是为了确保 visibility within a rendering command(CS 调度在 OpenGL 中被视为 "rendering commands")。如果不需要内部可见性,则不需要 coherent.


我想详细说明一下,因为这是一个常见的混淆来源:

I don't need to use glMemoryBarrier after writing to a texture using a framebuffer and then reading it with imageLoad

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

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