2011年5月9日月曜日

VBOの修正と頂点の転送

毎フレーム頂点を書き換える必要があるとして、
Vertex Buffer Object(VBO)の書き換えと、
毎フレーム頂点バッファを転送して描画するのはどちらが速いか。
データによりけりではある。

ここからは妄想。
----
VBOの書き換えを行った場合、
描画前にglFlushで書き換えを反映する必要があるGPUと、
そうでないGPUがある。Windows上のエミュレータは後者。
前者は描画時にバッファの書き込みを待たず、
後者は終わるまで待つ。

glFlushを呼ばない場合、
表示からするとバッファが壊れている。
このことから、VBOの書き換え時に
別のバッファを用意している。
仕様上はglFinishでなければ解決できない。
glFlushで上手くいっているように見えるのは、
単にglFlushに時間がかかって転送が完了しているだけなのか。
----
ここまで妄想。

glFlushを毎フレーム呼べば解決する。
しかし、重量級のglFlushは使いたくない、VBOの書き換えもしたい。
VBOのダブルバッファリングを行い、glFlushを呼ばない実装を試してみたところ、
一見上手く動作しているように見える。
swapBuffers等どこかのタイミングで、
そのフレームのコマンドが全て終了するのを待っている(glFinish)
と考えてよいものか。そうであるはずなのだが、自信を持てない。

0 件のコメント:

コメントを投稿