このサイトから: 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 で除算されるので、かなり混乱します。