本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出
Shader中的光照模型
6.2 CG标准库函数
在shader中常常会使用到一些数学函数,而官方有提供了一个标准库,里面声明了很多数学函数,直接调用也更加节省性能,下面是一些常用的函数:
6.3 Half-Lambert光照模型
在6.1中学习了Lambert模型,但是它有个致命缺点:物体背光部分全黑(细节缺失,如果再加一盏灯,性能开销更大)
于是诞生了Half-Lambert光照模型:
计算公式为:
Cdiffuse = (Clight · Mdiffuse) [0.5 * (n · l) + 0.5]
- Cdiffuse:物体的漫反射颜色
- Clight:入射光线颜色
- Mdiffuse:物体材质的漫反射颜色
- n:物体的表面法线
- l:物体指向的灯光方向向量
它没有把小于0的部分直接等于0,而是,先统一缩小0.5倍,再加上0.5,那么就使得光照有一个变暗的过程。
下面附上代码:
Shader "Chapter6/Half-Lambert"
{
Properties
{
_MainCol ("Main Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
struct v2f
{
float4 posi : SV_POSITION;
fixed4 diff : COLOR0;
};
fixed4 _MainCol;
v2f vert (appdata_base v)
{
v2f o;
o.posi = UnityObjectToClipPos(v.vertex);
//法线向量
float3 n = UnityObjectToWorldNormal(v.normal);//(将法线从)模型空间转换成世界空间,已标准化处理
//灯光方向向量
fixed3 l = normalize(_WorldSpaceLightPos0.xyz);//获取世界空间平行光向量,标准化处理
//计算漫反射
fixed ndotl = dot(n,l);
o.diff = _LightColor0 * _MainCol * (0.5 * ndotl + 0.5);//主要变化
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return i.diff;
}
ENDCG
}
}
}