我读了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,但它似乎对我不适合。
答案 0 :(得分:7)
您对glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards)
的来电表示您只丢弃1个帧缓冲附件,但您的丢弃数组包含两个:GL_DEPTH_ATTACHMENT
和GL_COLOR_ATTACHMENT0
。
尝试将其更改为:
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, discards);
事实上,您说您在绘制周期结束时丢弃这些帧缓冲附件,但直接在[m_context presentRenderbuffer:GL_RENDERBUFFER];
之前丢弃。您正在丢弃渲染缓冲区所需的颜色渲染缓冲附件 - 也许只是尝试丢弃深度附件,因为此时不再需要它。
您只需要初始化缓冲区一次,不每个绘制周期。 glDiscardFramebufferEXT()
实际上并没有删除你的帧缓冲附件 - 它只是一个提示,表示在discard命令完成后该绘制周期中不需要renderbuffer的内容。来自Apple的OpenGL ES Programming Guide for iOS:
丢弃操作由EXT_discard_framebuffer定义 扩展,可在iOS 4.0及更高版本上使用。丢弃操作 应用程序在早期版本上运行时应该省略 ioS,但只要它们可用就包括在内。丢弃是一个 性能暗示OpenGL ES;它告诉OpenGL ES的内容 在应用程序之后,您的应用程序不会使用一个或多个渲染缓冲区 discard命令完成。通过暗示您的OpenGL ES 应用程序不需要renderbuffer的内容,数据在 可以丢弃缓冲区或保存内容的昂贵任务 可以避免更新这些缓冲区。