2011-08-29 14 views
3

私は自分のプログラムでピクセル(GL_POINTS)で3Dキューブを埋めるループを持っているので、少しスピードアップするためにOpenMPを使用してマルチコアプロセッサ。OpenGLを使用したOpenGLは常にsegfault

問題は、私はここで、ループプログラムセグメンテーション違反でのOpenMPを使用して任意の時間は、ループのコードであることである:

glBegin(GL_POINTS); 
#pragma omp parallel for 
for (int a = 0; a < m_width * m_height; a++) 
{ 
    uint8_t r, g, b; 
    r = m_data[a * m_channels]; 
    g = m_data[a * m_channels + 1]; 
    b = m_data[a * m_channels + 2]; 

    glColor3ub(r, g, b); 
    glVertex3f(r/255.0 - 0.5, g/255.0 - 0.5, b/255.0 - 0.5); 
} 
glEnd(); 

あなたが見ることができるように、コードがちょうどM_DATA配列からいくつかの情報を取得し、 glColor3ubとglVertex3fを呼び出します。#pragmaを使わずにこのコードを実行すると、コードが大きく実行されます。

gdbは、glColor3ubに到達したときにsegfaultsが表示され、問題がOpenGLで何かであることを明らかにしています。おそらく関数はスレッドセーフではないでしょうか?コードを修正するために何かできますか?

+0

これで効果があると思われる原因は何ですか? – genpfault

答えて

5

OpenGLのコンテキストとマルチスレッドを混乱させたり、クリティカルセクションでOpenGLを使用するたびにガードしたりしないでください。おそらくできることは、頂点配列/バッファを使用することです(とにかく速くなります)、単一のスレッドで描画する前に複数のスレッドを使用してデータを埋めることです。

スレッドが現在の色を設定し、頂点を描画する前にスケジュールされていない場合はどうなりますか?しかし、間違いなく起こるのは、ある運転の途中で運転手が中断し、その内部データが完全に乱れてしまうことです。

OpenGLはスレッドセーフではありません。

+0

あなたは、常にあなたのアプリのメインスレッドでOpenGL呼び出しを発行する必要があります。 – karx11erx

+0

OpenGLは、スレッドセーフです。コンテキストは、一度に1つのスレッドだけでアクティブになることがあります。また、共有リストを持つ複数のコンテキストは同時に自分のスレッドでアクティブになることができますが、ターゲットフレームバッファを共有すると、これはパフォーマンスが悪く、あらゆる種類の問題のレシピになります。 – datenwolf

+0

クリスチャン、私にいくつかの例を教えて頂けますか、私に頂点配列を研究してもらえますか?私はopenGLには本当に新しいので、あなたが何を話しているのかは分かりません。 –

関連する問題