4

私のアプリケーションは、フレームバッファから深度情報を読み取ることに依存しています。これを glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data) で実装しました

ただし、これは非常に遅く実行され、アプリケーションがスムーズな 30fps からラグのある 3fps になります。他のディメンションまたはデータを読み戻そうとすると、許容レベルで実行されます。

概要を説明するには:

  • glReadPixels なし -> 毎秒 30 フレーム
  • glReadPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data); -> 毎秒 20 フレーム、許容範囲
  • glReadPixels(0, 0, 幅, 高さ, GL_RED, GL_FLOAT, &depth_data); -> 毎秒 20 フレーム、許容範囲
  • glReadPixels(0, 0, 幅, 高さ, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data); -> 毎秒 3 フレーム、受け入れられない

最後の呼び出しが他の呼び出しに比べて非常に遅いのはなぜですか? それを改善する方法はありますか?

幅 x 高さは約 100 x 1000 で、サイズを大きくすると呼び出しが遅くなります。

ピクセルバッファオブジェクトも使用しようとしましたが、これはパフォーマンスに大きな影響を与えず、glMapBuffer() 呼び出しまで速度が遅くなるだけです。

(私はこれを MacBook Air nVidia 320m グラフィックス OS X 10.6 でテストしましたが、不思議なことに、私の古い MacBook Intel GMA x3100 では深度バッファの読み取りが最大 15 fps でした。)

更新: GLUT_MULTISAMPLE を glutInitDisplayMode オプションから除外すると、アプリケーションが再びスムーズな 20fps に戻るという大きな違いが生まれました。そもそもオプションが何をするのかわかりません。誰か説明できますか?

4

3 に答える 3

3

メイン フレームバッファが MSAA 対応 (GLUT_MULTISAMPLE が存在する) の場合、2 つの実際のフレームバッファが作成されます。1 つは MSAA で、もう 1 つは通常です。

最初の 1 つは入力する必要があります。前面と背面のカラー サーフェスに加えて、深度とステンシルが含まれています。2 つ目は、対応する MSAA サーフェスを解決することによって生成される色のみを含む必要があります。

ただし、ドライバーを使用して深さを読み取ろうとするとglReadPixels、MSAA 対応の深さサーフェスも解決する必要があり、おそらく速度が低下します。

于 2011-03-31T13:27:23.460 に答える
1

深度バッファに選択したストレージ形式は何ですか?

GLfloat でない場合は、読み取り時に深度バッファー内のすべての深度を float に変換するよう GL に要求しています。(GL_RED を使用した 3 番目の箇条書きでも同じです。カラー バッファはフロート バッファでしたか?)

于 2011-03-31T12:26:59.857 に答える
0

GL_FLOAT であろうと GL_UNSIGNED_BYTE であろうと、glReadPixels は依然として非常に遅いです。PBO を使用して RGB 値を取得すると、非常に高速になります。PBO を使用して RGB 値を処理する場合、CPU 使用率は 4% です。ただし、深度値を処理する場合は 50% に増加します。GL_FLOAT、GL_UNSIGNED_BYTE、GL_UNSIGNED_INT、GL_UNSIGNED_INT_24_8 を試しました。したがって、深度値の読み取りには PBO は役に立たないと結論付けることができます

于 2013-01-18T05:48:58.937 に答える