2012-06-23 79 views
1

編輯:它似乎是現在剩下的唯一問題,就是光線來自相反的方向,如果我用法線貼圖進行計算。如果我只用:HLSL着色器(Phong/w法線貼圖)

n = normalize(Input.NorView); 

這似乎是罰款。

我開始學習DirectX10的一些HLSL陰影,我試圖用普通的地圖來計算我的phong閃電。 首先這裏是我已經走了多遠的例子:

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

我不太知道這是什麼即時尋找這個法線貼圖來實現: http://i.stack.imgur.com/moQvf.jpg

我不知道這個看起來不會更3DISH嗎?也許我只是對法線貼圖的使用有一個錯誤的理解,但在我的心態中,法線貼圖用於通過添加基於法線貼圖的陰影來更加詳細地模型化,所以它看起來更像3D。

這裏是我的陰影代碼: 頂點着色器:

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; 
} 

的Pixel Shader:

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; 
} 

我也有閃電使用法線貼圖時,即時通訊改變方向的感覺。但我不確定。 也許有人可以向我解釋這件事。 在此先感謝您的幫助!

+0

因爲我只能添加2個超鏈接,這裏是一個沒有使用正常映射的截圖:http://i.stack.imgur.com/eJ8OZ.jpg – puelo

回答

0

似乎我正在計算正常的不正確,一些紋理也得到了錯誤的正常。

0

法線貼圖不會創建陰影。簡而言之,它允許您重新評估每個紋理元素的光照。

+0

好的。感謝那。 現在我已經呈現了沒有漫反射,環境或輝光地圖的整個事物,只有正常的地圖適用於查看閃電是否正確。它看起來像是根據法線貼圖照亮它,但光線似乎來自與之前完全相反的方向。我已經檢查過矩陣......他們似乎是正確的。 – puelo

+0

@Puelo:TBH如果它的方向錯誤,你認爲你錯過了否定嗎? – Goz

+0

我已經自己修復了它。似乎我設置輸入正常的z值是錯誤的。不管怎麼說,多謝拉 ;)。這兩種方法之間沒有明顯的區別是正常的嗎?我的意思是使用標準化的Input.NorView或整個計算與B N T? – puelo