加法线效果 和漫反射模型的shader代码有点类似
漫反射模型是计算物体表面和和光照方向的角度
法线是在切线空间下计算法线图片的UV信息和光照方向的角度
当然我是看其他文章猜的 可能有错误 这里有原文章
https://blog.csdn.net/puppet_master/article/details/53591167
https://blog.csdn.net/puppet_master/article/details/57125379
想看原理的可以去上面地址自己looklook
下面是代码
Properties{
_Diffuse("Diffuse", Color) = (1,1,1,1)
_MainTex("Base 2D", 2D) = "white"{}
_BumpMap("Bump Map", 2D) = "bump"{}
_BumpScale ("Bump Scale", Range(0.1, 30.0)) = 10.0
}
//子着色器
SubShader
{
Pass
{
//定义Tags
Tags{ "RenderType" = "Opaque" }
CGPROGRAM
//引入头文件
#include "Lighting.cginc"
//定义Properties中的变量
fixed4 _Diffuse;
sampler2D _MainTex;
//使用了TRANSFROM_TEX宏就需要定义XXX_ST
float4 _MainTex_ST;
sampler2D _BumpMap;
float _BumpScale;
//定义结构体:vertex shader阶段输出的内容
struct v2f
{
float4 pos : SV_POSITION;
//转化纹理坐标
float2 uv : TEXCOORD0;
//tangent空间的光线方向
float3 lightDir : TEXCOORD1;
};
//定义顶点shader
v2f vert(appdata_tan v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//这个宏为我们定义好了模型空间到切线空间的转换矩阵rotation,注意后面有个;
TANGENT_SPACE_ROTATION;
//ObjectSpaceLightDir可以把光线方向转化到模型空间,然后通过rotation再转化到切线空间
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
//定义片元shader
fixed4 frag(v2f i) : SV_Target
{
//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
//直接解出切线空间法线
float3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));
//normalize一下切线空间的光照方向
float3 tangentLight = normalize(i.lightDir);
//根据半兰伯特模型计算像素的光照信息
fixed3 lambert = 0.5 * dot(tangentNormal, tangentLight) + 0.5;
//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
//进行纹理采样
fixed4 color = tex2D(_MainTex, i.uv);
return fixed4(diffuse * color.rgb, 1.0);
}
//使用vert函数和frag函数
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}