2011-09-16 5 views
2

私はiOS OpenGL ES Logical Buffer Loadsを読んで、それぞれの描画サイクルの後で深さバッファを "破棄"することでパフォーマンスが向上することを知りました。私はこれを試していますが、それは私のゲームエンジンがもうレンダリングされていないからです。次のサイクルをレンダリングしようとすると、glError 1286またはGL_INVALID_FRAMEBUFFER_OPERATION_EXTが表示されます。OpenGL ES 2.x:深度バッファを破棄する方法glDiscardFramebufferEXT?

私はそれを破棄しようとすると、深さのバッファを初期化または設定する必要があると感じますが、これに関する情報を見つけることはできません。

// Discard the depth buffer 
    const GLenum discards[] = {GL_DEPTH_ATTACHMENT, GL_COLOR_ATTACHMENT0}; 
    glBindFramebuffer(GL_FRAMEBUFFER, m_depthRenderbuffer); 
    glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards); 
:ここ

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

そして、私は、各ドローサイクルの終わりにデプスバッファを破棄するために何をしようとしているされています。ここでは、私は(実際にはすべてのバッファ、)デプスバッファを初期化する方法であります

私はすぐに私の描画呼び出しのすべてと...

[m_context presentRenderbuffer:GL_RENDERBUFFER]; 

に任意のアイデアを、次のことを呼んで?誰かが私に指摘できる情報?私は主題(私が元の考えを持っていたところ)のAppleのガイドを通して読むことを試みました、http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html、それは私のためにかなり正しく動作していないようです。 GL_DEPTH_ATTACHMENTGL_COLOR_ATTACHMENT0glDiscardFramebufferEXT(GL_FRAMEBUFFER,1,discards)

答えて

7

あなたの呼び出しは、しかし、あなたの破棄配列が2を含み、あなただけの1フレームバッファの添付ファイルを破棄していると言っています。

はそれを変更してみてください:

実際に
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のパフォーマンスヒントである です。 discardコマンドが完了した後に、 の1つまたは複数のレンダーバッファの内容がアプリケーションによって使用されていないことをOpenGL ESに通知します。 アプリケーションがレンダバッファの内容を必要としないことをOpenGL ESに示唆すると、 のデータは破棄することができます。または、これらのバッファの内容を更新しないようにする高価なタスクを避けることができます。

+0

StuDev、おまえはそうだよ - 私は2番目の議論のために2の代わりに1を送っていた。さらに、GL_FRAMEBUFFERの破棄を実行していましたが、デプスバッファをインスタンス化するときにGL_RENDERBUFFERにバインドしていました(トリックを行った)。 – David

+0

興味深い修正...私にとっては、深度バッファをGL_RENDERBUFFERにバインドする必要がありますが、廃棄するときはGL_FRAMEBUFFER列挙子を使用する必要があります。 – David