【问题标题】:OpenGL ES 2.x: How to Discard Depth Buffer glDiscardFramebufferEXT?OpenGL ES 2.x:如何丢弃深度缓冲区 glDiscardFramebufferEXT?
【发布时间】:2011-09-16 20:37:07
【问题描述】:

我读到iOS OpenGL ES Logical Buffer Loads 可以通过在每个绘制周期后“丢弃”深度缓冲区来获得性能提升。我试试这个,但这是因为我的游戏引擎不再渲染。当我尝试渲染下一个循环时,我收到 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);

这是我试图在每个绘制周期结束时丢弃深度缓冲区的方法:

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

我在所有的绘图调用之后立即调用它......

[m_context presentRenderbuffer:GL_RENDERBUFFER];

有什么想法吗?有人可以指出我的任何信息吗?我尝试阅读 Apple 关于该主题的指南(我从那里得到了最初的想法)http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html,但它似乎不太适合我。

【问题讨论】:

    标签: iphone opengl-es framebuffer depth-buffer


    【解决方案1】:

    您对glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards) 的调用表示您只丢弃了1 个帧缓冲区附件,但是您的丢弃数组包括两个:GL_DEPTH_ATTACHMENTGL_COLOR_ATTACHMENT0

    尝试将其更改为:

    glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, discards);
    

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

    您只需要初始化一次缓冲区,不是每个绘制周期。 glDiscardFramebufferEXT() 实际上并没有删除您的帧缓冲区附件 - 它只是对 API 的提示,表明在丢弃命令完成后,在该绘制周期中不需要渲染缓冲区的内容。来自 Apple 的OpenGL ES Programming Guide for iOS

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

    【讨论】:

    • StuDev,你说得对——我在第二个参数中发送了 1 而不是 2。此外,我在 GL_FRAMEBUFFER 上运行了丢弃,尽管我在实例化深度缓冲区时将其绑定到 GL_RENDERBUFFER(成功了)。
    • 有趣的更正...对我来说,我必须将深度缓冲区绑定到 GL_RENDERBUFFER,但在丢弃时使用 GL_FRAMEBUFFER 枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多