0

このサイトから: 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 は 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;

繰り返しますが、これはわかりません。以前にビュー プロジェクションを乗算したときに InvertViewProjection を使用する理由がわかりましたが、z 全体と w が 1 に等しくなり、その後位置全体が w で除算されるので、かなり混乱します。

4

1 に答える 1

3

これを完全に理解するには、3D 変換を支える代数がどのように機能するかを理解する必要があります。SO は、行列の計算にはあまり役に立ちません (または、使い方がわかりません)。ただし、ここにいくつかの高レベルの説明があります:

よく見ると、頂点位置で発生するすべての変換 (モデルからワールド、ビュー、クリップ座標へ) がたまたま 4D ベクトルを使用していることに気付くでしょう。それは正しい。4D。なぜ、私たちは 3D の世界に住んでいるのですか? その 4D 表現では、頂点に対して通常実行したいすべての変換が、行列の乗算として表現できるためです。これは、3D 表現にとどまる場合には当てはまりません。そして、行列の乗算は GPU が得意とするところです。

3D の頂点は 4D では何に対応しますか? ここが興味深いところです。(x, y, z)ポイントはラインに対応します(a.x, a.y, a.z, a)。必要な計算を行うために、この線上の任意のポイントを取得できます。通常、最も簡単なポイントを選択しますa=1(この方法では、乗算を行う必要はなく、 を設定するだけですw=1)。

それで、あなたが見ているほとんどすべての数学に答えます。4D で 3D ポイントを投影するには、w=1 を設定します。3D の標準サイズと比較したいコンポーネントを 4D ベクトルから取得するには、そのコンポーネントを w で除算する必要があります。

もっと深く掘り下げたい場合、この座標系は と呼ばれhomogeneous coordinatesます。

于 2009-11-11T17:49:44.870 に答える