我想在多个计算着色器中使用imageStore
和imageLoad
。
这与“正常”渲染命令(glDraw)混合到屏幕或帧缓冲区,但这些命令不使用imageStore
或imageLoad
(仅使用texture
或texelFetch
)。
我只有一个OpenGL上下文和线程。
我的假设如下:
imageStore
时,我需要先在后面的计算着色器中执行glMemoryBarrier
或在以后的片段着色器中进行imageLoad
或texture
,然后再执行texelFetch
。 coherent
。 glSync
。 glMemoryBarrier
读取它,不需要使用imageLoad
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/