1

假设我有四个内容层:A、B、C 和 D;每一个都代表一种类型的视觉内容。

每个层执行几个顺序渲染调用(没有来自各个层的交错渲染调用)。

此外,为了应用视觉效果,需要将 B 层和 D 层渲染到纹理。为了减少内存占用,我只使用了一个只有一个纹理的 FBO。

所以,目前我这样做:

  • 渲染A内容;
  • 绑定 FBO > 渲染 B 内容 > 取消绑定 FBO > 渲染纹理(B 内容);
  • 渲染 C;
  • 绑定 FBO > 渲染 D 内容 > 取消绑定 FBO > 渲染纹理(D 内容)。

这种方法的主要问题是,每次绑定/取消绑定 FBO 时,默认帧缓冲区都会保存到内存/从内存中恢复。

我不能简单地先将图层 B 和 D 绘制到 FBO,因为我无法更改图层的渲染顺序。

有没有更好的方法来做到这一点并避免主帧缓冲区的许多保存/恢复?请记住,这是一个示例,实际情况更复杂(更多层)。

4

2 回答 2

0

能够在渲染目标之间快速切换是 FBO 功能的主要原始目的。它通常比旧的 pbuffer 方法更快,因为它不必处理不断变化的渲染上下文。此外,FBO 不像 pbuffers 那样依赖 EGL 来分配渲染表面。如果 Adreno 200 不能快速切换 FBO,那么这是 Adreno 特有的实施问题。

于 2013-08-06T20:57:08.107 回答
0

驱动程序将从内存中取回 FBO 的内容(这是一个代价高昂的操作),除非您glClear()在绘制之前清除 FBO。清除 FBO 将提示驱动程序丢弃当前内容,而不是将它们从主存储器中取出。如果您的 FBO 有深度缓冲区,请确保在调用glClear().

由于您只使用一个 FBO,因此您可能无法绕过它。检查您的内存要求是否如此严格以至于您不能使用第二个 FBO,因此您可以将 B 渲染到您的第一个 FBO,然后将 D 渲染到您的第二个,然后将所有内容层一起渲染到屏幕上。

于 2013-08-07T07:05:02.697 回答