1

ゲーム エンジンにディファード シェーディングを追加し始めています。深度テクスチャから目の空間座標を取得する方法を理解するのに苦労しています。

私はこの投稿で2つの方法について読んで、私の理解で:

  • 最初の方法は、深さをフレームバッファに保存する場合に機能GL_DEPTH_ATTACHMENTします。
  • 2 番目の方法では、シェーダーで深さを計算し、GL_COLOR_ATTACHMENTn.

この 2 番目の方法の再構成は、私が必要とするものに対して複雑すぎるように思われるので、可能であれば使用したくありません。

目の座標を再構築するために、最初のメソッドは、テクスチャ座標、 depth、および aw1.0aを取得し、それを逆透視行列vec4で乗算し、結果を で割ります。w

この方法は、テクスチャに保存されている深さを変更せずに機能し、GL_DEPTH_ATTACHMENTライティングを実行するのに十分正確ですか?

そのままでは機能しない場合、それを機能させるために深さをどうする必要がありますか?

4

1 に答える 1

1

シェーダーで深度を計算してカラー バッファーに格納する理由は、深度バッファーが非線形であるためです。パースペクティブ補正のため、(ビュー/ワールド空間位置の再構築に必要な) 線形深度を取得するために、サンプリングされた深度値に対して追加の処理を行う必要があります。

解決策としてに線形値を書きたくなることがgl_FragDepthあります。これを行うチュートリアルも見たことがありますが、これは行わないでください。これは、階層的な z バッファリングや初期の深度テストなど、最新のハードウェア深度バッファーの最適化を破壊します。

あなたが指摘した 2 番目のアプローチは、不必要に複雑であるだけでなく、恐ろしく非効率的でもあります。再構成中に非線形深度バッファーを単純に線形化する方がよいでしょう。G バッファーの作成中に、2 つの場所 (深度バッファーへの暗黙的な書き込みと、専用のカラー バッファーへの 1 つ) に深度を書き込むよりも、いくつかのフラグメント シェーダー命令を追加する方が高速です。

于 2013-10-31T17:50:24.827 に答える