仅渲染到纹理的一部分

时间:2018-04-05 16:35:02

标签: opengl-es framebuffer

我可以将2000x2000纹理绑定到FBO中的颜色附件,并告诉OpenGL的行为就像纹理更小一样,假设为1000x1000?

关键是,在我的渲染周期中,我需要渲染很多(大多数是小的)中间纹理,但我一次只需要1个。我在想,不是创建许多较小的纹理,而是只有1个适当大的纹理,我会将它绑定到手边的FBO,告诉OpenGL只渲染其中的一部分,并节省内存。

或许我应该每帧多次破坏/重建这些纹理?这肯定会节省更多的内存,但这不会导致明显的放缓吗?

1 个答案:

答案 0 :(得分:1)

  

我可以将2000x2000纹理绑定到FBO中的颜色附件,和   告诉OpenGL的行为就像纹理更小一样,让我们​​说吧   1000×1000?

是的,只需将glViewport()设置为您要渲染的区域,如果您正在启用剪刀测试,请记得调整glScissor()边界区域。

  

或许我应该多次摧毁/重建这些纹理   每帧?这肯定会节省更多的内存,但不会   导致明显放缓的原因?

每帧完全破坏和重新创建一个新的纹理对象会很慢,因为它会导致不断的内存重新分配开销,所以绝对不要这样做。

拥有一个预先分配的纹理池,你可以循环使用它很好 - 这是一种非常常见的技术。在存储2K * 2K纹理的内存方面,与存储4个独立的1K * 1K纹理相比,你不会真正节省太多 - 总存储要求相同,相比之下额外的元数据开销很小 - 所以如果将它们分开则更容易在应用程序逻辑方面,我建议这样做。