glTextureBarrier()和glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)之间的区别

use*_*931 6 memory opengl opengl-es render-to-texture

glMemoryBarrier在GL 4.2及更高版本中可用,而glTextureBarrier在GL 4.5中可用

glTextureBarrier允许在片段着色器从中获取时同时渲染到相同的纹理,IFF纹理的每个纹素都被纹理拾取恰好一次.

我想知道glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)是否允许这样做?如果没有,是否有一个等同于glTextureBarrier的OpenGL ES?

Nic*_*las 4

glTextureBarrier 允许在片段着色器从中获取纹理时同时渲染到同一纹理中,IFF 纹理的每个纹素都被纹理获取命中一次。

不,事实并非如此。

glTextureBarrier是一个函数。ARB_texture_barrier 是一个扩展(也是 GL 4.5 的一部分)。作为规范更改的一部分,ARB_texture_barrier 扩展允许对附加图像进行单次读取/修改/写入。

现在,调用glTextureBarrier将允许您进行第二次读取/修改/写入。您可以再次调用它以获得另一张通行证。但glTextureBarrier其本身并不赋予您读/修改/写权限。这是一个整体的扩展。

另请注意,这两个函数没有任何共同点。

glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)仅适用于不连贯内存操作(SSBO/图像加载/存储)的写入。该特定的屏障位意味着在此函数之前发出的不连贯写入对于在此函数之后发出的纹理样本操作将变得可见。

glTextureBarrier特别适用于写入帧缓冲区附加图像以及随后在着色器中读取它们。帧缓冲区写入不是不连贯的内存操作,因此它们不受调用控制glMemoryBarrier

如果没有,是否有与 glTextureBarrier 等效的 OpenGL ES?

目前还没有。考虑到倾向于实现 ES 的硬件类型,它不太可能实现这一目标。虽然总体想法对于基于图块的渲染器来说有其优点,但这对它们来说只是错误的抽象。

Vulkan 的输入附件和管道屏障更适合在 TBR 中执行此类操作。