0

glMapBuffer の一般的な使用法は次のとおりです。

previousPBO.render();
bindNextPBO();
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
    doSomeWork(src);
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}

別の方法で動作する 2 つの PBO があります。

ただし、doSomeWork(.) が別のスレッドにある場合もあります。上記のコードが適用される場合、現在のスレッドは doSomeWork() が終了するまで待機する必要があります。別の解決策は次のとおりです。

previousPBO.render();
bindNextPBO();
if(currentPBO.mapped) {
    currentPBO.mapped = false;
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
    currentPBO.mapped = true;
    doSomeWork(src);
}

この場合、同じ PBO の map->unmap 手順は 2 つのフレームにまたがります。

  • PBO のマップされていない状態は、GPU のレンダリングを停止しますか?
  • パフォーマンスへの悪影響はありますか?
4

1 に答える 1

0

2 番目のコード スニペットは間違っています。doSomeWork時間内に終わらなかったら?現在、マップを解除したメモリにアクセスしており、アクセス違反 (またはさらに悪い) が発生します。

より良いアプローチは、他のスレッドの完了を待って、フレームの最後でバッファをアンマップすることSwapBuffersです。

于 2012-07-10T18:35:13.420 に答える