简介
法线贴图用来使模型更加细致.
把一个模型做的十分精细非常难,用法线贴图替换原纹理的法线,改变漫反射使我们产生模型凹凸面更多,更细致的错觉.
代码
Shader "Custom/NewSurfaceShader"
{
Properties{
_Color("Color",Color) = (1,1,1,1)//贴图颜色
_MainTex("Main Tex",2D) = "white"{}//贴图
_NormalTex("Normal Tex",2D) = "white"{}//法线贴图
_BumpScale("Bump Scale",Float)=1//凹凸的缩放
}
SubShader
{
pass {
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;//贴图颜色
sampler2D _MainTex;//贴图
sampler2D _NormalTex;//法线贴图
fixed4 _MainTex_ST;//缺少这个无法偏移uv
fixed4 _NormalTex_ST;
float _BumpScale;
struct a2v {
float4 vertex:POSITION;//赋值模型空间顶点位置
float3 normal:NORMAL;//赋值模型空间法线
float4 texcoord:TEXCOORD0;//第一张贴图
float4 tangent:TANGENT;//没有这个 无法执行vert中的宏 变量名不可更改
};
struct v2f {
float4 position:SV_POSITION;//输出的屏幕位置
float2 mainUv:TEXCOORD2;//贴图的uv
float2 normalUv:TEXCOORD3;//法线的uv
float3 lightDir:TEXCOORD4;//切线空间下的光方向
};
v2f vert(a2v v) {
v2f f;
f.position = UnityObjectToClipPos(v.vertex);//屏幕坐标系下的位置
f.mainUv = TRANSFORM_TEX(v.texcoord, _MainTex);//得到偏移后的uv
f.normalUv= TRANSFORM_TEX(v.texcoord, _NormalTex);
TANGENT_SPACE_ROTATION; //调用这个后之后,会得到一个矩阵 rotation 这个矩阵用来把模型空间下的方向转换成切线空间下
f.lightDir = normalize(mul(rotation, ObjSpaceLightDir(v.vertex)));//切线空间下光的方向
return f;
}
fixed4 frag(v2f f) :SV_Target{
fixed4 normalColor = tex2D(_NormalTex,f.normalUv);//采样
fixed3 tangentNormal = UnpackNormal(normalColor);//切线
tangentNormal.xy = tangentNormal.xy*_BumpScale;
tangentNormal = normalize(tangentNormal);
fixed3 texColor = tex2D(_MainTex, f.mainUv) * _Color.rgb;//贴图颜色
fixed3 diffuse = _LightColor0.rgb * max(dot(tangentNormal, f.lightDir), 0) *texColor;//漫反射颜色 用了法线贴图的颜色 与切线空间下光的方向
return fixed4(texColor * UNITY_LIGHTMODEL_AMBIENT.rgb +diffuse,1);
}
ENDCG
}
}
FallBack "Diffuse"
}