我正在围绕 OpenGL ES 编写一个简单的 OOP 包装器。在编写渲染和帧缓冲区时,我必须绑定(bind)缓冲区才能使用它:
- (void) setupSomething
{
…
glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID);
…
}
现在,如果在已经绑定(bind)了其他渲染缓冲区的上下文中调用此设置代码怎么办?我上面提到的简单版本会产生切换当前缓冲区的令人讨厌的副作用,这听起来很脆弱。我认为我应该更加防御性地编写代码:
- (void) setupSomething
{
// Store current state
GLint previousRenderBuffer = 0;
glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, &previousRenderBuffer);
// Do whatever I want to do
glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID);
…
// Restore previous state
glBindRenderbufferOES(GL_RENDERBUFFER_OES, previousRenderBuffer);
}
我的问题是:像这样保存以前的状态真的有必要/明智/习惯吗?如果是,是否有某种 glPushSomething
可以为我做这件事?
最佳答案
使用像 OpenGL 这样的图形 API 时,尽量减少 API 调用次数通常是个好主意。有些调用可能非常昂贵——虽然我不确定 glBindRenderBuffer——它可能像只存储一个 int
一样便宜。但它可能是一些复杂的状态切换操作。你最好自己处理它 - 使用你自己的缓冲区“堆栈”(OpenGL ES 中没有 glPushAttrib
或类似的渲染缓冲区),或者,在我看来,最好避免这些情况 -始终确保在传递到另一个缓冲区之前使用已绑定(bind)的渲染缓冲区完成工作。
关于ios - 使用渲染缓冲区和帧缓冲区时是否应该清除 OpenGL 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341946/