【发布时间】:2013-08-06 13:25:47
【问题描述】:
假设我有四个内容层:A、B、C 和 D;每一个都代表一种类型的视觉内容。
每一层都执行几个顺序渲染调用(没有来自各个层的交错渲染调用)。
此外,B 层和 D 层需要渲染到纹理才能应用视觉效果。为了减少内存占用,我只使用了一个只有一个纹理的 FBO。
所以,我现在这样做:
- 渲染A内容;
- 绑定 FBO > 渲染 B 内容 > 取消绑定 FBO > 渲染纹理(B 内容);
- 渲染 C;
- 绑定 FBO > 渲染 D 内容 > 取消绑定 FBO > 渲染纹理(D 内容)。
我对这种方法的主要问题是每次绑定/取消绑定 FBO 时,默认的帧缓冲区都会保存到内存中/从内存中恢复。
我不能简单地先将图层 B 和 D 绘制到 FBO,因为我无法更改图层的渲染顺序。
有没有更好的方法来做到这一点并避免多次保存/恢复主帧缓冲区?请记住,这是一个示例,实际情况更复杂(更多层)。
【问题讨论】:
-
“每次我绑定/取消绑定 FBO 时,默认的帧缓冲区都会保存到内存/从内存中恢复。” - 你确定吗? FBO 的主要原则和优势之一不是因为根本不需要逐出/恢复默认帧缓冲区,因此不会发生这种情况(但可能是 ES 硬件在这方面的行为不同,这将不过,让 FBO 在那里相当痛苦)?
-
我不确定这是否发生在每个芯片上,但根据 Adreno 200 性能提示,每次绑定和取消绑定 FBO 时,驱动程序都会解析 GMEM 进出主内存。
标签: performance opengl-es rendering opengl-es-2.0 fbo