简介
法线贴图是凸凹贴图(Bump mapping)的一种常见应用,简单说就是在不增加模型多边形数量的前提下,通过渲染暗部和亮部的不同颜色深度,来为原来的贴图和模型增加视觉细节和真实效果。简单原理是在普通的贴图的基础上,再另外提供一张对应原来贴图的,可以表示渲染浓淡的贴图。将附加的表面凸凹的贴图于原贴图进行运算后,可以得到细节更加丰富立体的渲染效果。
大多数法线图是一张RGB贴图,其中红,绿,蓝三个通道分别表示由高度图转换而来的该点的法线指向:Nx、Ny、Nz。在其中绝大部分点的法线都指向z方向,因此图更偏向于蓝色。在shader进行处理时,我们将光照与该点的法线值进行点积后即可得到在该光线下应有的明暗特性,再将其应用到原图上,即可反应在一定光照环境下物体的凹凸关系了。
Shader "Demo/Diffuse Normal"{
Properties{
_MainTex("MainTex", 2D) = ""{}
_NormalMap("NormalMap", 2D) = ""{}
}
SubShader{
Tags{"RenderType"="Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _NormalMap;
struct Input {
float2 uv_MainTex;
float2 uv_NormalMap;
};
void surf(Input IN, inout SurfaceOutput o) {
half4 c = tex2D(_MainTex, IN.uv_MainTex);
float3 normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
o.Albedo = c.rgb;
o.Alpha = c.a;
o.Normal = normal;
}
ENDCG
}
FallBack "Diffuse"
}
half3 normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
UnpackNormal是定义在UnityCG.cginc文件中的方法。UnpackNormal接受一个fixed4的输入,并将其转换为所对应的法线值(fixed3)。在解包得到这个值之后,将其赋给输出的Normal,就可以参与到光线运算中完成接下来的渲染工作了。