2012-01-22 5 views
1

初めてVBOがGPUに送信されると、オブジェクト/オブジェクトグループが最初に描画されるときにVBOがフリーズします。レンダリング時にOpenGL VBOのみがGPUにアップロードされます

私はデータをこのようにロードしてみました:

glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, size, data); 

このよう

glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); 

しかし、結果は同じです。

私はその後、glBufferData後に三角形を描く場合:

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, NULL); 

は、問題が解決されていますが、私はこのソリューションはむしろハックを見つけます。

もっと良い解決策はありますか?

(私は256個の頂点それぞれを含む小さなVBOsの束を持っている)

+1

'glBufferData'に' NULL 'を渡すことは、「データをコピーしない」ことを意味します。私はあなたが異なる結果を出そうとする2つの異なる試みを期待する理由は分かりません。 –

+1

私は何も違うとは思っていませんでした。私はここで何をしているのかという理由で試してみました:http://www.opengl.org/wiki/Vertex_Buffer_Object – Jonathan

+0

@Jonathan:私は誓います。 Wikiの記事をインターネットから拭き取ってください。バッファオブジェクトに関する情報を見つける正しい場所は[this wiki page](http://www.opengl.org/wiki/Buffer_Object)です。 –

答えて

1

これは、バッファオブジェクトが動作する方法、つまり非同期操作をいくらか追加する方法です。データのアクセスがまだ完了していない場合には、バッファオブジェクトを大量にアップロードし、後でOpenGLの操作を続け、piplineが停止しているという考えがあります。 glBufferDataとglBufferSubDataは、ポインタがコールされたページをCoWにしたり、中間コピーを作成したりします。コールが返された後も安全にデータを破棄することができます。OpenGLクライアント側では、アップロードプロセス。

glFinish()を呼び出すと、操作piplineが完全に終了するまで(したがって名前)ブロックされます。

+0

問題はアップロードが「進行中」でないことです。アップロードは、VBOが使用されている場合にのみ発生します。 – Jonathan

+0

@ジョナサン:どうやってこれを測定しましたか?コードをどこかに投稿して、システムの仕様を再現できるようにしてください。 – datenwolf

+0

私はVBOをロードしてから何分も経っていても、私のシーンを初めてレンダリングすると1秒間フリーズします(VBOからロードした直後に三角形を描くと消えてしまいます)。私はRadeon HD 4870を持っています。 – Jonathan

0

は、あなたのglBufferData呼び出しの後にglFlush()を呼び出してみてください。

関連する問題