1

編集: 現在残っている唯一の問題は、法線マップで計算を使用すると、光が反対方向から来ることです。私だけを使用する場合:

n = normalize(Input.NorView);

大丈夫そうです。

DirectX10 で HLSL シェーディングを学習し始めており、法線マップを使用してフォン ライトニングを計算しようとしました。まず、ここに私がどこまで来たかの例を示します。

http://i.stack.imgur.com/IFAo4.jpg

これがこの法線マップで達成しようとしているものかどうかはよくわかりません: http://i.stack.imgur.com/moQvf.jpg

私は知りません..これはもっと3Dishに見えるべきではありませんか?法線マップの使い方が間違っているだけかもしれませんが、私の考え方では、法線マップに基づいて影を追加することでモデルをより詳細にするために法線マップが使用されるため、より立体的に見えます。

そして、ここに私のシェーディング コードがあります: 頂点シェーダー:

T3dVertexPSIn MeshVS(T3dVertexVSIn Input) {
    T3dVertexPSIn output = (T3dVertexPSIn) 0;
    float4 tempVar;

    output.Pos = mul(float4(Input.Pos.xyz, 1).xyzw, g_WorldViewProjection);

    output.Tex = Input.Tex;

    tempVar = mul(float4(Input.Pos.xyz, 1).xyzw, g_WorldView);
    output.PosView = tempVar.xyz;

    tempVar = mul(float4(Input.Nor.xyz, 0).xyzw, g_WorldViewNormals);
    output.NorView = tempVar.xyz;
    output.NorView = normalize(output.NorView);

    tempVar = mul(float4(Input.Tan.xyz, 0).xyzw, g_WorldViewNormals);
    output.TanView = tempVar.xyz;
    output.TanView = normalize(output.TanView);

    return output;
}

ピクセル シェーダー:

float4 MeshPS(T3dVertexPSIn Input) : SV_Target0 {
    float4 output = (float4)0; //output color

    float3 N = normalize(Input.NorView);

    float3 T = Input.TanView;

    T = normalize(T - N * dot(N,T));
    float3 B = cross(T,N);

    column_major float3x3 mTBN= {T, B, N};
    float4 matDiffuse = g_Diffuse.Sample(samAnisotropic, Input.Tex);
    float4 matSpecular = g_Specular.Sample(samAnisotropic, Input.Tex);
    float4 matGlow = g_Glow.Sample(samAnisotropic, Input.Tex);
    float4 colLight = float4(1,1,1,1);
    float4 colLightAmbient = float4(1,1,1,1);
    float3 n = mul(g_Normal.Sample(samAnisotropic, Input.Tex).rgb * 2.0 - 1.0, mTBN);
    //float3 n = mul(float3x3(T,B,N), nT);
    //float3 n = normalize(Input.NorView);
    float4 I = g_LightDirView;
    float3 r = reflect(-I.xyz, n);
    float3 v = normalize(-Input.PosView);

    float cd = 0.5f, cs = 0.3f, ca = 0.1f, cg = 0.3f;



    output = cd*matDiffuse*saturate(dot(n,I.xyz))*colLight
            +cs*matSpecular*pow(saturate(dot(r.xyz,v)),10)*colLight
            +ca*matDiffuse*colLightAmbient
            +cg*matGlow;


    return output;
}

また、法線マップを使用しているときに稲妻の方向が変わっているような気がしますが、よくわかりません。たぶん、誰かがこの問題を私に少し説明してくれます。助けてくれてありがとう!

4

2 に答える 2

0

法線マップはシャドウイングを作成しません。簡単に言うと、テクセルごとの照明を再評価することができます。

于 2012-06-23T14:06:00.837 に答える
0

法線が正しく計算されていなかったようで、一部のテクスチャも間違った法線になりました。

于 2012-06-29T20:53:55.850 に答える