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

| 在OpenGL / ES中,您必须注意在实现渲染到纹理功能时,不要引起反馈循环(从与写入相同的纹理中读取像素)。出于明显的原因,当您读取和写入纹理的相同像素时,行为是不确定的。但是,如果您正在读取和写入相同纹理的不同像素,它也是不确定的行为吗?例如,如果我尝试制作一个内部包含渲染纹理的纹理图集。在渲染纹理时,我从存储在纹理地图集中的另一个纹理读取像素。 因为我没有在纹理中读取和写入相同的像素,所以仍然认为行为是不确定的,仅因为数据来自相同的纹理?     
已邀请:
           但是,如果您正在读取和写入相同纹理的不同像素,它也是不确定的行为吗? 是。 缓存是这里的大问题。当您写入像素数据时,不必立即将其写入图像。写入存储在高速缓存中,因此可以一次写入多个像素。 纹理访问执行相同的操作。问题在于它们没有相同的缓存。因此,您可以写入写缓存中的一些数据,但是纹理缓存不知道它。 现在,这里的规范有些繁琐。从理论上讲,您可以从纹理的一个区域读取并写入另一区域(但规范未定义),只要您从未从写入的任何位置读取即可,反之亦然。显然,这不是很有帮助。 NV_texture_barrier扩展使您可以解决此问题。尽管是NVIDIA扩展,但ATI硬件也支持它。它的工作方式是当您要刷新所有缓存时调用call0ѭ函数。这样,可以确定当您从某个位置读取时,您已经写了它。 因此,您的想法是将纹理的一个区域指定为写入区域,将另一个区域指定为读取区域。渲染了一些东西之后,需要进行回读,然后触发屏障并交换纹理区域。这就像贴图平铺,但无需进行繁琐的操作来附加新的贴图或绑定FBO或更改绘制缓冲区。     
        问题不是反馈循环的可能性(从技术上讲,这不会导致循环,而是读取/写入像素的顺序不明确,导致行为无法定义),但GPU的访问模式的局限性在于:缓冲区只能在任何给定时间读取或写入(聚集与分散访问)。而且,GPU始终会看到一个整体的缓冲区。这是该限制的主要原因。     
        是的,仍然如此,GPU是大规模并行的,因此您不能真正说一次写入一个像素,当准备好纹理时,也会填充一些缓存系统。如果您写入相同的纹理,则需要同步缓存,依此类推。 为了获得一些见识,您可以看一下NV_texture_barrier OpenGL扩展,它是为了增加此领域的灵活性。     
        是的,读写纹理的不同区域也是不确定的。但是,为什么要关心它是否未定义,只需写入另一个纹理并完全避免该问题!     

要回复问题请先登录注册