Шейдер HLSL (карта нормалей / фонг)
РЕДАКТИРОВАТЬ: кажется, что единственная проблема, оставшаяся сейчас, заключается в том, что свет идет с противоположного направления, если я использую вычисления с картой нормалей. Если я только использую:
n = normalize(Input.NorView);
кажется, все в порядке.
Я начинаю изучать некоторые HLSL Shading с DirectX10, и я попытался использовать карту нормалей для расчета молнии фонг. Прежде всего, вот пример того, как далеко я зашел:
Я не совсем уверен, что именно этого я и хочу добиться с помощью этой карты нормалей:
Я не знаю.. разве это не должно выглядеть более 3Dish? Возможно, я просто неверно понимаю использование карты нормалей, но, по моему мнению, карта нормалей используется для того, чтобы сделать модель более детальной, добавив тени на основе карты нормалей, чтобы она выглядела более трехмерной.
А вот мой код штриховки: Vertex Shader:
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;
}
У меня также есть ощущение, что молния меняет направление, когда я использую карту нормалей. Но я не уверен. Может быть, кто-то может объяснить мне этот вопрос немного. Заранее благодарю за любую помощь!
2 ответа
Похоже, я неправильно вычислял нормаль, а некоторые текстуры тоже получили неправильный нормаль.
Карта нормалей не создает теней. Это просто позволяет вам переоценить освещение в расчете на тексель.