ios - 使用渲染缓冲区和帧缓冲区时是否应该清除 OpenGL 状态?

标签 ios objective-c opengl-es

我正在围绕 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/

相关文章:

iphone - UISwitch旧版本

objective-c - enumerateObjectsUsingBlock : used for? 的 BOOL *stop 参数是什么

android - 在 Canvas 中更好的帧率绘制位图?

android - 使用模板测试剪辑在 OpenGL-ES 中绘制的项目

ios - 调用了 editActionsForRowAt IndexPath 但未显示 EDIT 和 DELETE

ios - 如何在 UITableViewCell 上添加 UIControlEvents

ios - 使用 AutoLayout 移动 UIView 的位置

ios - 如何从 NSURLSessionDataTask 和调用 block 中获取返回值?

opengl - GLSL 2.0属性问题

ios - Earlgrey 在访问 NavBar/TabBar Items 时很慢