私のアプリケーションは、フレームバッファから深度情報を読み取ることに依存しています。これを 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 に戻るという大きな違いが生まれました。そもそもオプションが何をするのかわかりません。誰か説明できますか?