// Upgrade NOTE: replaced ‘_World2Object’ with ‘unity_WorldToObject’
// Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,)’ with 'UnityObjectToClipPos()’
Shader “Unity Shaders Book/Chapter 6/Diffuse Vertex-Level” {
Properties {
_Diffuse (“Diffuse”, Color) = (1, 1, 1, 1)
}
SubShader {
Pass {
Tags { “LightMode”=“ForwardBase” } --只有正确定义LightMode 才能得到Unity内置的光照模型,例如 _LightColor0
LightMode 是Pass标签中的一种,它用于定义该Pass在Unity的光照流水线中的角色。
CGPROGRAM
#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;
// Transform the vertex from object space to projection space
o.pos = UnityObjectToClipPos(v.vertex); --Unity内置的模型*世界*投影矩阵 使得顶点位置从模型空间转换到裁剪空间中
// Get ambient term
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; --Unity内置变量,获取环境光信息
// Transform the normal from object space to world space
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject)); --把在a2v中获取的模型空间中的法线方向转换到世界空间中
// Get the light direction in world space
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); --获取世界空间中的光源方向
// Compute diffuse term
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight)); --dot点乘
o.color = ambient + diffuse;
return o;
}
fixed4 frag(v2f i) : SV_Target {
return fixed4(i.color, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader “Unlit/TestTwo” //逐片面光照渲染
{
Properties
{
_Diffuse(“MainColor”,Color) =(1,1,1,1)
}
SubShader
{
Tags {“LightMode”=“ForwardBase” } --只有正确定义LightMode 才能得到Unity内置的光照模型,例如 _LightColor0
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include “Lighting.cginc” --引用内置的光照库
fixed4 _Diffuse;
struct appdata
{
float4 vertex : POSITION; --顶点
float3 normal : NORMAL; --法线
};
struct v2f
{
float4 pos : SV_POSITION; --传入到片面着色器的顶点信息
float3 WorldNormal : TEXCOORD0; --传入到片面着色器的法线信息
};
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); //将模型的顶点转换到世界坐标中
o.WorldNormal = mul (v.normal,(fixed3x3)unity_WorldToObject); --把模型坐标系下得法线转换到世界坐标系下
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取当前场景中的环境光信息
fixed3 WorldLight = normalize(_WorldSpaceLightPos0.xyz); --将世界坐标系下的主光源的位置信息归一化
fixed3 Normal = normalize(i.WorldNormal); --将世界坐标系的模型顶点的法线归一化
fixed3 lightinfo = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(WorldLight,Normal)); --dot点乘,saturate (x)将x值限制在0-1之间
fixed3 color = lightinfo + ambient;
return fixed4 (color ,1.0) ;
}
ENDCG
}
}
}