マルチスレッドOpenGLアプリケーションを使用してVBOを更新し、それらを同時に使用する方法


11

簡単なアプリケーションがあります。2つのスレッドがあり、それぞれに独自のレンダリングコンテキストがありますが、1つのVBOを共有しています(これは機能しており、テストしました)。

ここで私が欲しいのは、1つのスレッドがVBOの前半から一部のデータをレンダリングし、2番目のスレッドがVBOの2番目の部分を更新していることです。

VBOを更新しない場合、問題なく動作しています。

しかし、更新時に奇妙な問題がいくつかあります。glMapBuffer(2番目のスレッドで)VBOを更新するために使用すると、ほとんどの場合、最初のスレッドでは何もレンダリングされませんglClear。画面全体が(呼び出し後)クリアになります。VBOからのデータにアクセスできないようです(これは理解できます。これは、バッファー全体がマップされており、何らかの方法でロックできるためです)。

glMapBufferRange使ってみましたGL_MAP_UNSYNCHRONIZED_BIT。これは、「あなたが望むようにVBOを待たずに使用しないでください。私(プログラム)が自分で同期するからです」を意味します。また、VBOの範囲をマップして別の部分からデータをレンダリングするとき、それは待っているべきではありませんが、私と同じ問題が発生していますglMapBuffer

誰かがこれを修正するのを手伝ったり、なぜそれが起こるのか説明したりできますか?

回答:


6

誰かがこの問題に興味がある場合は、OpenGLフォーラムで解決策見つけることができます。基本的に、バッファは2つのスレッドまたはコンテキストから同時にアクセスできません。読み取りも書き込みもできません。したがって、次のようなロック機構std::mutexが必要です。


解決策を指摘していただきありがとうございます。回答をまとめて要約しました。
danijar 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.