2013-10-19 10 views
7

私はOpenGLコードを実行しようとしていましたが、GL_DEPTH_BUFFER_BITがglClear()でクリアされていないため、シーンをレンダリングできませんでした。私はこのビットを追加し、シーンがレンダリングされました。なぜこのクリアビットを使用する必要がありますか?なぜレンダリング中にOpenGLのデプスバッファをクリアする必要がありますか?

GPUが使用していたデプスバッファの値をクリアする理由は分かっているかもしれませんが、確認したいだけです。

答えて

15

深度バッファは、シーン内のピクセルの「深度」を保持します。 OpenGLでジオメトリをレンダリングすると、各フラグメント(ピクセル)がそのポイントでデプスバッファの値と比較されます。そのフラグメントのz値がバッファ内のz値よりも小さい場合、それは新しい最低値になり、したがってレンダリングされるピクセルになります。そうでない場合は、レンダリングしないでください。それは要点です - 詳細は自分で読むことができます。

シーンが変わるとどうなりますか? 画面をクリアしてすべてを再描画するようにしたいが、深度バッファもクリアしたい。なぜですか?さもなければ、全ての新しいピクセルが前のフレームからの深度値と比較されるからである。それは意味をなさない - 彼らは彼らが入っているフレームのものと比較されるべきです!あなたはあなたの推論で正しいです。

+4

また、フレームごとに深度範囲と深度テストの方向を交互に変更することもできます。しかし、デプスバッファをクリアすることは現代的なハードウェアの性能最適化でもあることが判明しました。フレームバッファをタイルに分割することで無損失のZバッファ(およびカラーバッファ)圧縮を実装します。スクリーン内の何も持たない領域の値を取り出すときには - tileを使います。だから、カラーバッファと深度バッファをクリアするのを避けるために人々が使用していた古いハックは、現代のGPUで実際にパフォーマンスを傷つけています;) –

+0

これは私が理由を考えたものです: Perfect ans。 – 2am

関連する問題