2017-06-30 18 views
0

を凍結:glMapBufferRangeは、コンピュートシェーダを使用して、データの集合を生成し、シェーダストレージバッファに格納した後、私は、コードを使用してデータをプリントアウトするために、そのバッファから読み取るしようとしていますOpenGLのドライバ

#define INDEX_AT(x,y,z,i) (xyzToId(Vec3i((x), (y), (z)),\ 
            Vec3i(NUM_RAYS_X,\ 
              NUM_RAYS_Y,\ 
              POINTS_ON_RAY))\ 
          * 3 + (i)) 
PRINT_GL_ERRORS(); 
glBindBuffer(GL_SHADER_STORAGE_BUFFER, dPositionBuffer); 
float* data_ptr = NULL; 
for (int ray_i = 0; ray_i < POINTS_ON_RAY; ray_i++) 
{ 
    for (int y = 0; y < NUM_RAYS_Y; y++) 
    { 
     int x = 0; 
     data_ptr = NULL; 
     data_ptr = (float*)glMapBufferRange(
      GL_SHADER_STORAGE_BUFFER, 
      INDEX_AT(x, y, ray_i, 0) * sizeof(float), 
      3 * (NUM_RAYS_X) * sizeof(float), 
      GL_MAP_READ_BIT); 
     if (data_ptr == NULL) 
     { 
      PRINT_GL_ERRORS(); 
      return false; 
     } 
     else 
     { 
      for (int x = 0; x < NUM_RAYS_X; x++) 
      { 
       std::cout << "(" 
        << data_ptr[x * 3 + 0] << "," 
        << data_ptr[x * 3 + 1] << "," 
        << data_ptr[x * 3 + 2] << ") , "; 
      } 
     } 

     glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); 
     PRINT_GL_ERRORS(); 
     std::cout << std::endl; 
    } 

    std::cout << "\n" << std::endl; 
} 

関数xyzToIdは3次元座標を1次元のインデックスに変換します。私は、マッピングは、全くのみ768台の山車は非常に大きくはないよ

​​

バッファ:

私はこれを実行しようと

は、しかし、プログラムはエラーメッセージを与えて、glMapBufferRangeへの呼び出しでクラッシュ、問題なく完了した(2つの浮動小数点数の)異なるシェーダストレージバッファ上のglMapBufferへの以前の呼び出し。私はこのエラーに関連する情報をオンラインで見つけることができないようで、glMapBufferRangeの速度について読んだことは、このサイズのバッファはマップするのに数十ミリ秒かかります。プログラムがクラッシュするタイムアウト。

glMapBufferRangeの使用方法が不明ですか?

+1

"* glMapBufferRangeをどのように使用するべきかについて何か不明ですか?*"はい。ループ*内にバッファ*をマップするべきではありません。これは重量のある操作です。単にポインタを返すだけではありません。 *範囲の終わりから読み終わったときにのみマップを解除してください。数バイトをマップしないでください。それはあなたの問題を解決するかもしれないし、そうでないかもしれませんが、それに関係なく、働くには間違った方法です。 –

+0

問題は、この特定のアプリケーション(これは、より小さなデータセットでコードをデバッグするために使用しています)ではバッファがあまり大きくないのに対し、意図した使用法はバッファが大きすぎて私のメモリに収まらないことです利用可能です。その問題を回避する唯一の方法は、より小さな部分に分割することでした。 上記に関係なく、バッファ全体を一度に使用してglMapBufferでテストしましたが、問題は解決しませんでした。 –

+0

"*バッファが大きすぎて、使用可能なメモリに収まらない*"どうすればそのようなバッファを割り当てられますか?マップするのが大きすぎる場合は、 'glBufferData'には大きすぎます。さらに、それは一度にいくつかの浮動小数点のマッピングを正当化するものではありません。範囲全体をマップできない場合は、範囲の*大きな*部分をマップします。 –

答えて

1

これは無関係なエラーです。今日私は、OpenGLがコマンドをバッファリングすることがあり、バッファをマッピングするなどのいくつかのアクションがキュー内のすべてのコマンドを終了させることを学びました。この場合、実際には計算シェーダ自体をディスパッチするアクションでした。

今日、シェーダストレージバッファを境界から外してインデックスを作成すると、OpenGLドライバが完了するまでに時間がかかるようにフリーズすることがわかりました。

これは主に、さまざまなエラーとなり、間違った場所にポップアップするエラーのケースでした。

関連する問題

 関連する問題