我想在多个计算着色器中使用imageStore
和imageLoad
。
这与" normal"混合将命令(glDraw)渲染到屏幕或帧缓冲区,但这些命令不会使用imageStore
或imageLoad
(仅texture
或texelFetch
)。
我只有一个OpenGL上下文和线程。
我的假设如下:
imageStore
时,我需要先执行glMemoryBarrier
,然后在稍后的计算着色器中执行imageLoad
,或在后续片段中执行texture
或texelFetch
着色器。coherent
。glSync
。glMemoryBarrier
imageLoad
glMemoryBarrier
,则没有"线程问题"。它们是否正确?
答案 0 :(得分:3)
每一个都是正确的,可能的''''一个例外:
我根本不需要使用
coherent
。
您可能需要coherent
,具体取决于您的计算着色器正在执行的操作。如果您的计算着色器写入图像,然后从另一个invocation within the same dispatch写入的数据中读取,则需要coherent
。因此,如果您执行imageStore
,请发出计算着色器barrier()
,然后执行imageLoad
以阅读其他invocation的值,那么您需要coherent
限定符。
coherent
是关于确保visibility within a rendering command(CS调度被认为是"渲染命令"在OpenGL中)。如果您不需要内部可见性,那么您就不需要coherent
。
我想详细说明这一点,因为它是混淆的常见原因:
在使用帧缓冲区写入纹理然后使用
读取纹理后,我不需要使用glMemoryBarrier
imageLoad
这是绝对正确的。内存障碍是关于确保对内存的不连贯写入的可见性(和同步)。渲染到帧缓冲区是不是不连贯的写入。因此,您可以对此类数据使用imageLoad
,而无需显式同步。
当然假设你不是rendering to that framebuffer in the same operation you're imageLoad
ing from it。该规则仍然适用。