我有一个片段着色器,它使用图像加载/存储操作对 imageBuffer 执行处理。我只关心以下情况:
- 我有一个片段着色器(没有多阶段(例如顶点然后片段着色器)考虑因素,也没有多通道渲染)
- imageBuffer 变量被声明为一致的。只对连贯的 imageBuffers 感兴趣。
为了清楚起见,我的情况如下:
// Source code of my sole and unique fragment shader:
coherent layout(1x32) uniform uimageBuffer data;
void main()
{
...
various calls to imageLoad(data, ..., ...);
...
various calls to imageStore(data, ..., ...);
...
}
我主要查看了规范
尤其是这一段:
“使用声明为“连贯”的变量可以保证存储的结果将立即对使用类似声明的变量的着色器调用可见;调用 MemoryBarrier 是为了确保存储对其他操作可见。”
注意:我的“连贯统一的 imageBuffer 数据;” 声明正是一个“类似声明”的变量。我的场景是单通道、单阶段(片段着色器)。
现在,我查看了各种网站并偶然发现(就像我认为的大多数人一样)stackoverflow.com 上的这个线程:
GPU驱动程序如何解释GLSL的“连贯”内存限定符以进行多遍渲染?
更具体地说,本段:
“你的着色器甚至不能假设在存储之后立即发出负载将获得刚刚存储在这个着色器中的内存(是的,真的。你必须放入一个 memoryBarrier 才能将它拉下来)。”
我的问题如下:
使用指定的连贯限定符,在我的单着色器、单通道处理场景中,我是否可以确定 imageStore() 将立即对我的片段着色器的所有调用可见(例如,当前调用也是如此)与其他并发调用一样)?
通过阅读 ARB_shader_image_load_store 规范,在我看来:
- 这个问题的答案是肯定的,
- 我不需要任何类型的 memoryBarrier(),
- stackoverflow 中上述引用的线程中引用的句子可能确实具有误导性和错误性。
感谢您的洞察力。