回答:
デプスバッファーに書き込まれる値の範囲は、希望する値です。通常、これらは0から1の範囲です。デプスバッファーに書き込まれる実際の値は、ビューポートの変換中に、NDC空間の頂点のZ値に基づいて計算されます(パースペクティブをクリップ空間でwで除算した後)。
NDC深度値(Z、遠近法をWで除算した後)は、ビューポート変換の深度部分(X座標とY座標をウィンドウ内のピクセルに関連付ける座標空間に持ち込む)でスケーリングされ、次に(2^n-1)
-「2の累乗」として読み取られることを意味しますn
- n
デプスバッファーのビット精度です。結果の値は深度バッファーに書き込まれます。
ビューポート変換行列のOpenGLの分割定義glViewportとglDepthRangeコール。glDepthRangeは、求めている深度範囲を決定するためのスケールファクターを制御するものです。あなたは現在の範囲を回復するためにセレクターでglGetFloatvを呼び出すことができますGL_DEPTH_RANGE
。これにより、範囲を0から1であると想定せずに範囲を利用できます(実際には、99.9%の時間、実際には誰も変更しません)。
さらに読むと、アイスペースから深度バッファまでZ値を追跡するために数学を再構築する方法についての洞察が必要な場合。
深度バッファの値は常に0〜1の範囲です。ゼロはレンダリングされたフラグメントがニアプレーンの深度にあり、1はフラグメントがファープレーンの深度にあることです。そして、その間のすべて。
ワールドスペースの実際の深度を知りたい場合は、深度バッファから簡単に計算できます。
depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;
そして、それが深度バッファの精度を高めるために、投影行列でニアプレーンとファープレーンを指定する理由です。
深度バッファ値を使用する場合は、深度と距離の違いにも注意してください。