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 のレンダリングを停止しますか?
- パフォーマンスへの悪影響はありますか?