どのようにこの作品は奥行きマップを計算していますか?
-
19-09-2019 - |
質問
このサイトから: http://www.catalinzima.com/?page_id=14
私はいつもデプスマップを計算する方法について混乱してきました。
次のように頂点シェーダ機能は、位置を計算する:
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
output.TexCoord = input.TexCoord; //pass the texture coordinates further
output.Normal =mul(input.Normal,World); //get normal into world space
output.Depth.x = output.Position.z;
output.Depth.y = output.Position.w;
return output;
}
output.Position.zとoutput.Position.wは何ですか?私は、この背後にある数学のようにわからない。
とピクセルシェーダでは、この行がある:output.Depth = input.Depth.x / input.Depth.y。
output.Depthだからoutput.Position.z / outputPOsition.wのですか?なぜ我々はこれを行うのですか?
最後点における光シェーダ( http://www.catalinzima.com/?page_id= 55 の)コードである位置であることがこの出力を変換する
//read depth
float depthVal = tex2D(depthSampler,texCoord).r;
//compute screen-space position
float4 position;
position.xy = input.ScreenPosition.xy;
position.z = depthVal;
position.w = 1.0f;
//transform to world space
position = mul(position, InvertViewProjection);
position /= position.w;
再び、私はこのことを理解していません。我々は以前にビュー投影を掛け、しかし全体の位置をWで除算した後、全Z、現在1に等しくなるように行われ、Wは、私はかなりの混乱のように、我々はInvertViewProjectionを使用なぜ一種の参照
解決
完全にこれを理解するには、3Dを支える代数の作品を変換する方法を理解する必要があります。 SO本当に助けにはならない(または私はそれを使用する方法がわからない)行列演算を行うために、それは空想formulaesせずにする必要があります。ここではいくつかの高レベルの説明ががあります:
よく見ると、、あなたは4Dベクトルを使用しているために起こる頂点位置に起こるすべての変換(世界へのモデルからは、座標をクリップし表示する)ことがわかります。そのとおり。 4D。なぜ、私たちは、3Dの世界に住んでいたときに?そのため、4D表現で、私たちは通常、頂点にやりたいすべての変換は、行列の乗算として表現されています。我々は3D表現にとどまる場合、これはのないの場合です。そして、行列の乗算は、GPUが得意とするものです。
3Dの頂点は4Dにはどう対応しますか?それが面白いところです。 (x, y, z)
点は、ライン(a.x, a.y, a.z, a)
に相当します。私たちは、私たちに必要な数学を行うには、このライン上の任意のポイントをつかむことができ、私たちは通常、最も簡単な1、a=1
(そのように、我々は任意の乗算、ちょうどセットw=1
を行う必要はありません)を選びます。
答えはほとんどすべての数学あなたが見ているように。我々は3Dで私達の標準サイズと比較することを、4Dベクトルからコンポーネントを取り戻すために、我々はワットに設定= 1 4Dでの3Dポイントを予測するために、我々はワットで、そのコンポーネントを分割する必要があります。
この座標系あなたがより深く潜るしたい場合は、homogeneous coordinates
と呼ばれています。