0

これについてお役に立てれば幸いです。私は現在遅延レンダラーを使用しており、SSAO を実装しようとしていますが、それにはビュー空間法線が必要であり、現在ワールド空間法線を持っています。それらを変換する方法を見つけようとしていますが、スタックし続けています。

これは私の頂点シェーダーの主要部分であり、instanceTransformインスタンス化されたモデルにも同じコードが使用されるため、ワールド マトリックスまたはインスタンス マトリックスの転置のいずれかです。

VertexShaderOutput VertexShaderFunctionCommon(VertexShaderInput input, float4x4 instanceTransform)
{
    VertexShaderOutput output = (VertexShaderOutput)0;

    float4x4 worldViewProjection = mul(instanceTransform, ViewProjection);

    output.Position = mul(float4(input.Position.xyz,1), worldViewProjection);

    output.Depth = output.Position.zw;

    // calculate tangent space to world space matrix using the world space tangent, binormal, and normal as basis vectors
    output.TangentToWorld[0] = normalize(mul(input.Tangent, instanceTransform));
    output.TangentToWorld[1] = normalize(mul(input.Binormal, instanceTransform));
    output.TangentToWorld[2] = normalize(mul(input.Normal, instanceTransform));

    return output;
}

ピクセル シェーダーでの通常の計算は次のとおりです。

// read the normal from the normal map
float3 normalFromMap = tex2D(normalSampler, input.TexCoord);

//tranform to [-1,1]
normalFromMap = 2.0f * normalFromMap - 1.0f;

//transform into world space
normalFromMap = mul(normalFromMap, input.TangentToWorld);

//normalize the result
normalFromMap = normalize(normalFromMap);

//output the normal, in [0,1] space
output.Normal.rgb = NormalEncode(normalFromMap);

助けていただけますか?

4

0 に答える 0