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を読んでみましたが、そうではありません私にはうまく機能していないようです。