HLSL Shader (Phong /w normal map)
编辑:看来,现在剩下的唯一问题是,如果我对法线贴图使用计算,则光线来自相反的方向。如果我只使用:
1 | n = normalize(Input.NorView); |
似乎很好。
我开始学习一些DirectX10的HLSL阴影,并且尝试使用法线贴图来计算我的phong闪电。
首先,这是我走了多远的一个例子:
http://i.stack.imgur.com/IFAo4.jpg
我不确定这是否是我希望通过此法线贴图完成的工作:
http://i.stack.imgur.com/moQvf.jpg
我不知道..这看起来不应该是3Dish吗?也许我只是对法线贴图的用法有一个错误的了解,但是在我的心态中,法线贴图用于通过添加基于法线贴图的阴影来使模型更详细,因此它看起来更具有3D效果。
这是我的着色代码:
顶点着色器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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; } |
像素着色器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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; } |
当我使用法线贴图时,我也有闪电正在改变方向的感觉,但是我不
也许有人可以向我解释一下这件事。
在此先感谢您的帮助!
好像我在计算法线不正确,某些纹理也得到了错误的法线。
法线贴图不会创建阴影。 简而言之,它允许您重新评估每个纹理像素的照明。