1

我正在围绕 OpenGL ES 编写一个简单的 OOP 包装器。在编写渲染和帧缓冲区时,我必须绑定缓冲区才能使用它:

- (void) setupSomething
{
    …
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID);
    …
}

现在,如果在已经绑定了其他渲染缓冲区的上下文中调用此设置代码怎么办?上面提到的我的简单版本会产生切换当前缓冲区的令人讨厌的副作用,这听起来很脆弱。我想我应该更加防御性地编写代码:

- (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什么方法可以为我做吗?

4

1 回答 1

1

使用 OpenGL 之类的图形 api 通常最好尽量减少 api 调用的数量。有些调用可能非常昂贵——不过我不确定 glBindRenderBuffer ——它可能和存储一个一样便宜int。但这可能是一些复杂的状态切换操作。你最好自己处理它 - 使用你自己的缓冲区“堆栈”(glPushAttribOpenGL ES中的渲染缓冲区没有或类似的东西),或者,在我看来,最好避免这些情况 - 始终确保你完成你的工作在传递到另一个缓冲区之前渲染您已绑定的缓冲区。

于 2013-01-15T17:13:08.147 回答