公式:真实漫反射 = 光源颜色和强度信息 * 材质漫反射颜色 * saturate(dot(法线方向,光源方向))
代码:
Shader "Cutsom/Diffuse"
{
Properties{
_Diffuse("Diffuse",Color) = (1,1,1,1)//反射颜色
}
SubShader{
Pass{
Tags {"LightMode" = "ForwarBase"}//指定光照模式
CGPROGRAM
#pragma vertex vert//指定顶点函数
#pragma fragment frag//指定片元函数
#include "Lighting.cginc"//导入一些光照属性
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 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//将法线从模型空间转换到世界空间下便于后面的计算
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//光源数据
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb *saturate(dot(worldNormal, worldLight));//计算漫反射
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光信息
o.color = ambient + diffuse;//加上一个环境光
return o;
}
fixed4 frag(v2f i):SV_Target{
return fixed4(i.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}