OpenGLでは、深度バッファーの深度範囲をどのように発見できますか?


11

iOS用のGLマルチパスレンダリングアプリを実行しています。最初のパスは、深度バッファーテクスチャにレンダリングします。2番目のパスでは、深度バッファーの値を使用して、フラグメントシェーダーのアプリケーションを制御します。深度バッファーの値を有用なものに再スケーリングしたいのですが、その前に、深度バッファー値の深度値の範囲を知る必要があります。どうすればいいですか?

回答:


10

デプスバッファーに書き込まれる値の範囲は、希望する値です。通常、これらは0から1の範囲です。デプスバッファーに書き込まれる実際の値は、ビューポートの変換中に、NDC空間の頂点のZ値に基づいて計算されます(パースペクティブをクリップ空間でwで除算した後)。

NDC深度値(Z、遠近法をWで除算した後)は、ビューポート変換の深度部分(X座標とY座標をウィンドウ内のピクセルに関連付ける座標空間に持ち込む)でスケーリングされ、次に(2^n-1)-「2の累乗」として読み取られることを意味しますn- nデプスバッファーのビット精度です。結果の値は深度バッファーに書き込まれます。

ビューポート変換行列のOpenGLの分割定義glViewportglDepthRangeコール。glDepthRangeは、求めている深度範囲を決定するためのスケールファクターを制御するものです。あなたは現在の範囲を回復するためにセレクターでglGetFloatvを呼び出すことができますGL_DEPTH_RANGE。これにより、範囲を0から1であると想定せずに範囲を利用できます(実際には、99.9%の時間、実際には誰も変更しません)。

さらに読むと、アイスペースから深度バッファまでZ値を追跡するために数学を再構築する方法についての洞察が必要な場合。


スタッド式に追加されたすべての参照資料について、これをJoshに渡し、三角形の平面性について説明します。デプスマップが適切な値になるように、レンダリングしているジオメトリのZ範囲と正確に一致するようにクリッププレーンの近く/遠い位置にハックを行う傾向があります。私は何をしていますか?パス#1のデプスマップにあるものに基づいて、パス#2の間に場所固有の興味深いぼかし効果を作成したいと思います。
dugla

7

深度バッファの値は常に0〜1の範囲です。ゼロはレンダリングされたフラグメントがニアプレーンの深度にあり、1はフラグメントがファープレーンの深度にあることです。そして、その間のすべて。

ワールドスペースの実際の深度を知りたい場合は、深度バッファから簡単に計算できます。

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

そして、それが深度バッファの精度を高めるために、投影行列でニアプレーンとファープレーンを指定する理由です。

深度バッファ値を使用する場合は、深度と距離の違いにも注意してください。


@notebene。ほとんどあります。depthbufferの値の範囲を正確に0-> 1に再スケーリングしたいので、レンダリングされた最小/最大深度値が.25 / .75である場合、(深度値-.25)/(。75-.25)が必要です。したがって、パス1の後に深さバッファーの最小/最大を見つけ、それを使用してパス2の間に再スケーリングする方法はありますか
dugla

1
@dugla:平面である三角形をレンダリングしているため、最小深度と最大深度の値がシーンの最小頂点と最大頂点に関連付けられます。これら2つがわかっている場合は、パイプラインを介して手動で変換でき、深度バッファーに書き込む最小値と最大値がわかります。これはおそらくレンダリングよりも簡単で、デプスバッファー全体を読み戻して繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.