只渲染纹理的一部分

Rendering only to a part of a texture

我能否将 2000x2000 的纹理绑定到 FBO 中的颜色附件,并告诉 OpenGL 的行为就好像纹理更小,比方说 1000x1000?

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

或者也许我应该 destroying/recreating 那些纹理每帧多次?这肯定会节省更多内存,但这不会导致明显的速度下降吗?

Can I bind a 2000x2000 texture to a color attachment in a FBO, and tell OpenGL to behave exactly as if the texture was smaller, let's say 1000x1000?

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

Or maybe I should be destroying/recreating those textures many times per frame? That would certainly save even more memory, but wouldn't that cause a noticeable slowdown?

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

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