2

シーンをテクスチャにレンダリングしてから、投影を使用してそのテクスチャで水平面を描画しています。Webで見たサンプルのほとんどは、ビュー/プロジェクションマトリックスで頂点シェーダーに渡され、頂点を変換してから、ピクセルシェーダーで次のように処理されます。

projection.x = input.projectionCoords.x / input.projectionCoords.w / 2.0 + 0.5;
projection.y = input.projectionCoords.y / input.projectionCoords.w / 2.0 + 0.5;

私は次のことを行うシェーダーを持っていて、それも機能しますが、この特定のコードをどこで見つけたのか、または上記のコードで同じ結果がどのように得られるのかわかりません。これが私が持っているコードです

頂点シェーダー:(世界はidentityMatrixであり、viewProjは私のカメラを組み合わせたviewProjectionマトリックスです):

output.position3D =  mul(float4(vsin.position,1.0), world).xyz;
output.position = mul(float4(output.position3D,1.0), viewProj);

output.reflectionTexCoord.x = 0.5 * (output.position.w + output.position.x);
output.reflectionTexCoord.y = 0.5 * (output.position.w - output.position.y);
output.reflectionTexCoord.z = output.position.w;

ピクセルシェーダー:

float2 projectedTexCoord = (input.reflectionTexCoord.xy / input.reflectionTexCoord.z);

私を混乱させるのは、との使用法0.5 * (output.position.w + output.position.x)です0.5 * (output.position.w - output.position.y)。これはどのように同じ効果をもたらし、wコンポーネントはここで何を意味しますか?

4

1 に答える 1

2

しばらくして、結局同じものになることに気付きました:

0.5 * (output.position.w + output.position.x);

0.5 * output.position.w + 0.5 * output.position.x

次に、ピクセル シェーダーで次のようにします。

(0.5 * output.position.w + 0.5 * output.position.x) / output.position.w

(0.5 * output.position.w)/output.position.w + (0.5 * output.position.x) / output.position.w

最初の部分は 0.5 になります:

0.5 + 0.5 * ( output.position.x / output.position.w)

これは次のようになります。

(output.position.x / output.position.w) / 2 + 0.5

この計算を頂点シェーダーに移した方が効率的だと思うのでそのままにしておきます。

シェーダーから計算を完全に移動するには、クライアント側で行列を計算できます。

XMMATRIX v = XMLoadFloat4x4(&view);
XMMATRIX p = XMLoadFloat4x4(&projection);

XMMATRIX t(
    0.5f, 0.0f, 0.0f, 0.0f,
    0.0f, -0.5f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.5f, 0.5f, 0.0f, 1.0f);

XMMATRIX reflectionTransform = v * p * t;
XMStoreFloat4x4(&_reflectionTransform, XMMatrixTranspose(reflectionTransform));

次に、頂点シェーダーが行う必要があるのは次のとおりです。

output.reflectionTexCoord = mul(float4(output.position3D,1.0), reflectionProjectionMatrix);
于 2013-02-26T13:36:09.857 に答える