Unity编写添加法线贴图的Shader
法线贴图的作用再次就不做过多赘述了,不了解的自己查一下即可,下面以实际例子展示添加法线贴图的模型与没有添加法线贴图的区别。
下图为两个相同的模型,
左侧的为添加了基本贴图、法线贴图两个贴图;
右侧模型只添加了基本贴图;
对比标注相同颜色的箭头处,比较添加法线贴图和没有添加法线贴图模型的区别
可以看出添加法线贴图的模型线条比较明显,有凹凸感
创建Shader脚本Base.shader(在Project面板右键Create-Shader),双击打开脚本编写让其只包含基本贴图
Shader "Custom/Base" {
Properties {
//基本贴图
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex; //在CG模块重新声明一下 _MainTex
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
创建Shader脚本NormalMapShader.shader(在Project面板右键Create->Shader),双击打开脚本编写让其只包含基本贴图
Shader "Custom/NormalMapShader" {
Properties {
//基本贴图
_MainTex ("Base (RGB)", 2D) = "white" {}
//法线贴图
_NormalMaping("NormalMaping", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex; //在CG模块重新声明一下 _MainTex
sampler2D _NormalMaping; //在CG模块重新声明一下 _NormalMaping
struct Input {
float2 uv_MainTex;
float2 uv_NormalMaping;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
// 提取法线值,UnpackNormal接受一个fixed4的输入,并将其转换为相应的法线值(fixed3)
o.Normal = UnpackNormal(tex2D(_NormalMaping, IN.uv_NormalMaping));
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
在Project面板右键Create -> Material,我再次创建了两个材质球,一个aaa, 一个bbb
选中 aaa材质球在Inspector面板选择需要的Shader
选好后界面如下
选中bbb材质球在Inspector面板选择需要的Shader
选好后如下
然后分别为aaa材质球和bbb材质球选择相应的贴图图片
上图中那张蓝紫色的图片即为法线贴图,在aaa材质球上自行选上此处略
选好后如下
分别将aaa材质球和bbb材质球拖拽给两个蜘蛛模型,效果如最上边的图所示