【问题标题】:Rendering Static and Dynamic Graphics OpenGL渲染静态和动态图形 OpenGL
【发布时间】:2014-05-29 16:31:09
【问题描述】:

我正在使用 OpenGL 管道开发 IOS 游戏。我已经能够将我想要的图形渲染到屏幕上,但是,我调用glDrawElements 的次数太多,并且担心最终会遇到性能问题。我的游戏中有几个不需要在每个渲染周期都渲染的静态元素。有没有办法可以将静态元素渲染到一个帧缓冲区并将动态元素渲染到另一个?

这是我尝试过的代码:

static BOOL renderThisFrameBuffer = YES;
    if (renderThisFrameBuffer) {
        glBindFramebuffer(GL_FRAMEBUFFER, interFrameBuffer);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_BLEND);
        glEnable(GL_DEPTH_TEST);

        // Set up projection matrix
        CC3GLMatrix *projection = [CC3GLMatrix matrix];
        float h = 4.0f * OpenGLView.frame.size.height / OpenGLView.frame.size.width;
        [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:50];
        glUniformMatrix4fv(projectionUniform, 1, 0, projection.glMatrix);

        glViewport(0, 0, OpenGLView.frame.size.width, OpenGLView.frame.size.height);

        for (BoardSpace *boardSpace in spaceArray){
            [boardSpace drawWithMatrix:modelView];
        }

        [context presentRenderbuffer:GL_RENDERBUFFER];
        glBindFramebuffer(GL_FRAMEBUFFER, constFrameBuffer);
        renderThisFrameBuffer = false;
    }

在这种情况下,我之前创建了两个帧缓冲区:interFrameBuffer 用于静态元素,constFrameBuffer 用于动态元素。我错过了什么吗?

【问题讨论】:

    标签: opengl-es opengl-es-2.0 framebuffer


    【解决方案1】:

    应该是可以的。最直接的方法是将静态元素渲染到 FBO 一次。然后在每次重绘时,将静态 FBO 的内容复制到默认帧缓冲区,然后在其上绘制动态元素。

    ES 2.0 的特性集有点支持这一点。例如,您没有glBlitFramebuffer(),这将是一种将 FBO 内容复制到默认帧缓冲区的便捷方式。但是您可以使用一个简单的着色器程序进行复制,该程序通过顶点着色器中的坐标进行馈送,并且仅在片段着色器中使用纹理采样操作。然后绑定你渲染静态内容的纹理,并绘制一个屏幕大小的四边形。

    如果您的动态渲染需要来自静态渲染的深度缓冲区,这将变得更加棘手。例如,如果动态内容被静态内容遮盖,就会出现这种情况。在这种情况下,您还需要复制深度缓冲区。从快速刷新我对规范的记忆来看,我没有看到任何可以在 ES 2.0 中实现这一点的东西。 glBlitFramebuffer() 不存在。而且看起来 ES 2.0 不支持深度纹理。如果你想去那里,你正在进入 ES 3.0 领域。

    有了所有这些,您显然希望确保它确实有助于您的表现。复制帧缓冲区不是免费的。只有当它比渲染静态元素更便宜时才会有回报。在您做出决定之前,绝对需要对这两种方法进行基准测试。

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多