2

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

4

1 に答える 1

7

への呼び出しglDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards)は、フレームバッファの添付ファイルを 1 つだけ破棄していると言っていますが、破棄配列にはGL_DEPTH_ATTACHMENTとの 2 つが含まれていますGL_COLOR_ATTACHMENT0

次のように変更してみてください。

glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, discards);

実際、描画サイクルの最後にこれらのフレームバッファの添付ファイルを破棄していると言っていますが、[m_context presentRenderbuffer:GL_RENDERBUFFER];. renderbuffer を表示するために必要な color renderbuffer アタッチメントを破棄しています。おそらく、この時点ではもう必要ないため、depth アタッチメントを破棄してみてください。

すべての描画サイクルではなく、バッファを一度だけ初期化する必要があります。は、フレームバッファ アタッチメントを実際に削除するわけではありません。glDiscardFramebufferEXT()これは、破棄コマンドが完了した後の描画サイクルでは、レンダ バッファの内容が不要であることを示す API へのヒントにすぎません。Apple のiOS 用 OpenGL ES プログラミング ガイド から:

破棄操作は EXT_discard_framebuffer 拡張によって定義され、iOS 4.0 以降で使用できます。アプリケーションが以前のバージョンの ioS で実行されている場合、破棄操作は省略されますが、使用可能な場合はいつでも含まれます。破棄は、OpenGL ES に対するパフォーマンスのヒントです。これは、discard コマンドの完了後に、1 つまたは複数のレンダーバッファーの内容がアプリケーションによって使用されないことを OpenGL ES に伝えます。アプリケーションがレンダーバッファーのコンテンツを必要としないことを OpenGL ES に示唆することで、バッファー内のデータを破棄したり、それらのバッファーのコンテンツを更新し続けるためのコストのかかるタスクを回避したりできます。

于 2011-09-16T22:22:31.357 に答える