2

我阅读了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);

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

    // 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,但它没有似乎不太适合我。

4

1 回答 1

7

您的电话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 提示您的应用程序不需要渲染缓冲区的内容,缓冲区中的数据可以被丢弃,或者可以避免保持这些缓冲区内容更新的昂贵任务。

于 2011-09-16T22:22:31.357 回答