基础纹理
1.切线空间下计算光照
在片元着色器中通过纹理采样得到切线空间下的法线信息,然后再与切线空间下的视角方向、光照方向等进行计算。
(1)在顶点着色器中将视角方向和光照方向从模型空间变换到切线空间中。即需要知道模型空间到切线空间的变换矩阵。
根据在顶点着色器中按切线、副切线、法线的顺序按列排列可得切线->模型的变换矩阵
由逆矩阵可得模型->切线空间的变换矩阵 即按行排列。
(2)属性
Properties
{
_Color("Color",Color)=(1,1,1,1)
_MainTex ("Texture", 2D) = "white" {
}
_BumpMap("Normal Map",2D)="white"{
}//法线纹理
_BumpScale("Bump Scale",Float) = 1.0//法线凹凸程度
_Specular("Specular",Color) = (1,1,1,1)//高光
_Gloss("Gloss",Range(8,256)) = 20//高光区域
}
(3)光照模式-前向渲染
Tags {
"LightMode" = "ForwardBase" }
(4)纹理属性-平铺和平移属性
利用_MainTex和_BumpMap定义_MainTex_ST和_BumpMap_ST
(5)修改顶点着色器的输入结构体appdata
struct appdata
{
float4 vertex : POSITION;//顶点信息
float3 normal:NORMAL;//法线信息
float4 tangent:TANGENT;//顶点切线信息,需要用w向量确定副切线的方向
float4 texcoord:TEXCOORD0;
};
(6)修改顶点着色器的输出结构体v2f
struct v2f
{
float4 pos:SV_POSITION;
float4 uv:TEXCOORD0;
float3 lightDir:TEXCOORD1;//在顶点着色器下计算切线空间下的光照和视角方向
float3 viewDir:TEXCOORD2;
};
因为要在顶点着色器中计算光照方向和视角方向,所以申明两个变量 传给片元着色器使用。
(7)顶点着色器
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv.zw