1.在UnityShader中实现逐顶点漫反射光照模型
计算公式:
漫反射光照 = 光源颜色与强度 * 漫反射颜色 * saturate(dot(法线方向,光照方向));
Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level"
{
Properties
{
//定义属性,控制材质的漫反射颜色
_Diffuse ("Diffuse", Color)=(1,1,1,1)
}
SubShader
{
Pass
{
//指明该Pass的光照模式
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
//告诉Unity我们定义的定点着色器和片远着色器的名字
#pragma vertex vert
#pragma fragment frag
// 包含引用内置文件
#include "Lighting.cginc"
//引用属性,定义一个与该属性类型相匹配的变量
fixed4 _Diffuse;
//定义顶点着色器的输入和输出结构体
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;//存储模型法线信息
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR;//将顶点着色器中计算的光照颜色传递给片元着色器
};
//在顶点着色器中实现逐顶点漫反射光照
v2f vert (a2v v)
{
v2f o;
//将顶点坐标从模型坐标转换为裁剪坐标
o.pos = UnityObjectToClipPos(v.vertex);
//获取环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//将法线从模型空间转到世界空间(光源方向和法线必须处在同一坐标空间下)
//截取变换矩阵的前三行前三列,使用其逆矩阵即调换mul函数中的位置,最后归一化
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object));
//获取世界空间中的光源方向
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
//漫反射光照=(光源颜色与强度信息*漫反射颜色)max(0,dot(顶点法线,光源方向);)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
o.color = ambient + diffuse;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//输出顶点
return fixed4(i.color,1.0);
}
ENDCG
}
}
Fallback "Diffuse"
}