OpenGL ES 2.x:如何丢弃深度缓冲区glDiscardFramebufferEXT?

Dav*_*vid 2 iphone opengl-es framebuffer depth-buffer

我阅读了iOS OpenGL ES逻辑缓冲区加载,通过在每个绘制周期后"丢弃"深度缓冲区可以达到性能增益.我试试这个,但这是因为我的游戏引擎不再渲染.当我尝试渲染下一个循环时,我得到一个glError 1286或GL_INVALID_FRAMEBUFFER_OPERATION_EXT.

如果我要丢弃它,我感觉我需要在每个周期初始化或设置深度缓冲区,但我似乎无法找到任何相关信息.这是我如何初始化深度缓冲区(实际上是所有缓冲区):

    // ---- GENERAL INIT ---- //        
    // Extract width and height.
    int bufferWidth, bufferHeight;
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
                                 GL_RENDERBUFFER_WIDTH, &bufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,
                                 GL_RENDERBUFFER_HEIGHT, &bufferHeight);

    // Create a depth buffer that has the same size as the color buffer.
    glGenRenderbuffers(1, &m_depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, GAMESTATE->GetViewportSize().x, GAMESTATE->GetViewportSize().y);

    // Create the framebuffer object.
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, m_colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                              GL_RENDERBUFFER, m_depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);
Run Code Online (Sandbox Code Playgroud)

以下是我想要在每个绘制周期结束时丢弃深度缓冲区的方法:

    // Discard the depth buffer
    const GLenum discards[]  = {GL_DEPTH_ATTACHMENT, GL_COLOR_ATTACHMENT0};
    glBindFramebuffer(GL_FRAMEBUFFER, m_depthRenderbuffer);
    glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards);
Run Code Online (Sandbox Code Playgroud)

在我的所有抽奖电话之后立刻打电话给我......

[m_context presentRenderbuffer:GL_RENDERBUFFER];
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?有人可以指点我的任何信息?我尝试阅读Apple关于这个主题的指南(我得到了最初的想法),http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html,但它没有似乎对我来说非常合适.

Stu*_*art 7

你的电话glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards)是说你丢弃了1个帧缓冲附件,但你的丢弃阵列包括两个:GL_DEPTH_ATTACHMENTGL_COLOR_ATTACHMENT0.

尝试将其更改为:

glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, discards);
Run Code Online (Sandbox Code Playgroud)

实际上,您说您在绘制周期结束时丢弃这些帧缓冲附件,但直接在之前[m_context presentRenderbuffer:GL_RENDERBUFFER];.您正在丢弃渲染缓冲区所需的颜色渲染缓冲附件 - 也许只是尝试丢弃深度附件,因为此时不再需要它.

您只需要初始化缓冲区一次,而不是每个绘制周期.在glDiscardFramebufferEXT()实际上并没有删除您的framebuffer附件-它仅仅是一个暗示,API说,丢弃命令完成后,不需要在绘制循环中渲染的内容.来自Apple的适用于iOSOpenGL ES编程指南:

丢弃操作由EXT_discard_framebuffer扩展定义,可在iOS 4.0及更高版本中使用.当您的应用程序在早期版本的ioS上运行时,应忽略丢弃操作,但只要它们可用,就应包括在内.丢弃是OpenGL ES的性能提示; 它告诉OpenGL ES,在discard命令完成后,应用程序不会使用一个或多个渲染缓冲区的内容.通过向OpenGL ES暗示您的应用程序不需要渲染缓冲区的内容,可以丢弃缓冲区中的数据,或者可以避免用于保持这些缓冲区内容更新的昂贵任务.