这里记录一些shader入门的一些基础公式。
光照模型:
漫反射光照模型核心公式:
lambert=max(0,N⃗ ⋅L⃗ ) (N:normal,L:lightDir)
漫反射光照 = 法线向量和光照向量的点积(要控制在0~1的范围内)。半兰伯特漫反射光照模型核心公式(half lambert)
lambert=(N⃗ ⋅L⃗ )×0.5+0.5
半兰伯特漫反射光照模型其实跟上面漫反射光照模型公式基本上一样,half lambert光照模型会让暗面变得更加亮一点,不会出现特别暗的这种效果。
Phong高光反射光照模型
specular=max(0,V⃗ ⋅R⃗ )m(V⃗ :视角方向向量;R⃗ :反射光方向向量;m:高光范围)
Blinn-Phong高光反射光照模型,此模型不需要反射光向量,用 (视角方向向量 + 光照向量)代替
specular=max(0,N⃗ ⋅H⃗ )m(N⃗ :法线向量;H⃗ :V⃗ +L⃗ ;m:高光范围)
一些公式:
- 顶点坐标系转换到裁剪坐标系
mul(UNITY_MATRIX_MVP,vertex)
- 环境光
UNITY_LIGHTMODEL_AMBIENT
- 法线坐标转换到世界坐标系
normal = mul(fixed4(v.normal,0),unity_WorldToObject).xyz;
//这里和上面一句是一样的效果,只是unity内置了此函数给我们用
normal = UnityObjectToWorldNormal(v.normal);
- 归一化光照向量
lightDir = normalize(_WorldSpaceLightPos0.xyz);
//这里和上面一句是一样的效果,只是unity内置了此函数给我们用
lightDir = normalize(UnityWorldSpaceLightDir(worldPos));
- 视角方向
viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos.xyz);
//这里和上面一句是一样的效果,只是unity内置了此函数给我们用
viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
- 反射光方向
//反射光方向 注:这里取负值,是因为_WorldSpaceLightPos0方向是有物体到光源方向的,
//而CG的reflect方法是需要光源到物体方向的,所以这里取负值
fixed3 reflectDir = normalize(reflect(-lightDir,normal));
- 获取texture uv像素
//_MainTex_ST.xy:代表缩放值,_MainTex_ST.zw:代表偏移量
uv = texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
//上面这一句unity给我们提供的宏
o.uv = TRANSFORM_TEX(texcoord,_MainTex);