gpt4 book ai didi

opengl - OpenGL/OpenGLES 中的帧缓冲区纹理行为

转载 作者:行者123 更新时间:2023-12-02 06:49:40 28 4
gpt4 key购买 nike

在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在读取和写入同一纹理的不同像素,这也是未定义的行为吗?一个例子是,如果我试图制作一个内部有渲染纹理的纹理图集。当我渲染到纹理时,我从存储在纹理图集中的另一个纹理读取像素。

由于我没有在纹理中读取和写入相同的像素,因此行为仍然被认为是未定义的,只是因为数据来自相同的纹理?

最佳答案

However, is it also undefined behavior if you are reading and writing to different pixels of the same texture?

是的。

缓存是这里的大问题。当您写入像素数据时,它不一定会立即写入图像。写入存储在缓存中,以便可以一次写入多个像素。

纹理访问做同样的事情。问题是它们没有相同的缓存。因此,您可能已经写入了写入缓存中的一些数据,但纹理缓存不知道它。

现在,这里的规范有点严厉。 理论上,您可以从纹理的一个区域读取数据并写入另一个区域(但规范未定义),只要您从不从任何位置读取数据即可。已写信给,反之亦然。显然,这没有多大帮助。

NV_texture_barrier 扩展允许您解决这个问题。尽管是 NVIDIA 扩展,但 ATI 硬件也支持它。它的工作方式是,当您想要刷新所有缓存时,调用 glTextureBarrierNV 函数。这样,您就可以确定当您从某个位置读取数据时,您已经写入了该位置。

因此,我们的想法是将纹理的一个区域指定为写入区域,将另一个区域指定为读取区域。渲染完一些内容后,您需要进行读回,您可以触发屏障并交换纹理区域。这就像纹理乒乓球,但不需要附加新纹理或绑定(bind) FBO 或更改绘图缓冲区等繁重操作。

关于opengl - OpenGL/OpenGLES 中的帧缓冲区纹理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6459339/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com