opengl - glTextureBarrier() 和 glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT) 的区别

标签 opengl memory opengl-es render-to-texture

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

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

我想知道 glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT) 是否也允许这样做?如果没有,是否有相当于 glTextureBarrier 的 OpenGL ES?

最佳答案

glTextureBarrier allows to simultaneously render into the same texture while the fragment shader is fetching from it, IFF every texel of the texture is hit by the texturefetches exactly once.



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

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

另外,请注意,这两个函数没有任何共同之处。
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)仅适用于 incoherent memory operations 的写入(SSBO/图像加载/存储)。该特定屏障位意味着在此函数之前发出的不连贯写入对于在此函数之后发出的纹理样本操作将变得可见。
glTextureBarrier特别适用于对帧缓冲区附加图像的写入以及在着色器中对其进行的后续读取。帧缓冲写入不是不连贯的内存操作,因此它们不受 glMemoryBarrier 控制。称呼。

If not, is there an OpenGL ES equivalent to glTextureBarrier?



目前还没有。考虑到倾向于实现 ES 的硬件类型,它不太可能实现。虽然总体思路对于基于 tile 的渲染器有好处,但对它们来说只是错误的抽象。

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

关于opengl - glTextureBarrier() 和 glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448712/

相关文章:

java - 使用 LWJGL 进行桌面捕获

OpenGL - glDrawBuffers 设置的状态存储在哪里?

c++ - OpenGL 3+ 黑屏 - C++

C++ 3d array - 动态内存分配在一行中对齐

java - 如何找到分配对象的剩余内存量?

c - malloc 和 strcpy,非法访问,C

ios - 是否可以将 Metal API 与 OpenGL ES 3.0 同时用于图形计算?

objective-c - 将 UIImage(或 JPEG)绘制到 EAGLView 上

android - 查找/重新映射 OpenGL ES 坐标平面的边界

swift - 需要 UnsafeMutablePointer<Type> 的函数!