2011-09-16 184 views
2

我读iOS OpenGL ES Logical Buffer Loads,可以通过在每个绘制周期后“丢弃”深度缓冲区来达到性能增益。我尝试了这一点,但这是因为我的游戏引擎不再渲染。当我尝试呈现下一个周期时,出现glError 1286或GL_INVALID_FRAMEBUFFER_OPERATION_EXT。OpenGL ES 2.x:如何放弃深度缓冲区glDiscardFramebufferEXT?

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

// ---- 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]; 

任何想法?有人可以指点我的任何信息?我尝试阅读苹果公司关于这个主题的指南(我有最初的想法),http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html,但它似乎并不适合我。

回答

7

您对glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards)通话说你丢弃仅有1 framebuffer的附件,但是你丢弃阵列包括两个:GL_DEPTH_ATTACHMENTGL_COLOR_ATTACHMENT0

尝试将其更改为:

glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, discards); 

其实,你说你在抽奖周期结束时丢弃这些帧缓冲区的附件,而是直接之前[m_context presentRenderbuffer:GL_RENDERBUFFER];。您将丢弃为呈现渲染缓冲区而需要的颜色渲染缓冲区附件 - 也许尝试放弃深度附件,因为此时不再需要此附件。

您只需要初始化您的缓冲区一次,而不是每个绘制周期。 glDiscardFramebufferEXT()实际上并没有删除你的framebuffer附件 - 这只是API的一个提示,说在放弃命令完成后,在draw循环中不需要渲染缓冲区的内容。从苹果公司的OpenGL ES Programming Guide for iOS

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

+0

StuDev,你是对的钱 - 我发送它1而不是2的第二个参数。而且,我在GL_FRAMEBUFFER上运行放弃,但是当我实例化深度缓冲区到GL_RENDERBUFFER时(虽然这样做)。 – David

+0

有趣的修正...对于我而言,我必须将深度缓冲区绑定到GL_RENDERBUFFER,但在丢弃时使用GL_FRAMEBUFFER枚举。 – David