漫反射: 光源射到的地方是亮的,没射到的地方是暗的
兰伯特定律:反射光线的强度 和 (光源方向和物体表面法线的夹角的余弦值)成正比。
个人对于兰伯特定律的思考:0-90度 夹角越大,余弦值越小,所以反射光线的强度也就越小,所以就越暗。大于90度的时候就是暗的
点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。
叉乘,也叫向量积。结果是一个和已有两个向量都垂直的向量。
diffuse 公式: 物体颜色 * 光源颜色 * max(0, dot(光源方向,物体法线方向))
个人理解:光源向量和发现向量点乘就是类似求余弦值
Shader Code
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Diffuse;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
fixed3 color : Color;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);//从模型空间转换到齐次裁剪空间
fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);//模型法线转换成世界法线
fixed3 worldLight = normalize( UnityWorldSpaceLightDir(mul(unity_ObjectToWorld, v.vertex).xyz));//求世界光线向量
fixed3 diffuse = _Diffuse.rgb * _LightColor0.rgb * max(0, dot(worldNormal, worldLight));//公式求漫反射颜色
o.color = diffuse;//传给frag着色器
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color, 1);
}
ENDCG
以上都是个人笔记,个人理解,如有问题,给我私信,谢谢!