Unity ShaderLab(1)-基本光照模型
一、基本光照模型公式
颜色 = 环境光 + 漫反射光 + 镜面反射光
二、环境光
Ka是一个三维向量,成员的范围是0至1。代表了某个位置对于全局环境光的各个分量的衰减比率;
GlobalAmibent是三维RGB颜色;
三、漫反射光
Kd:物体对于反射光线的衰减系数;
lightColor:灯光颜色;
L:从物体某一点指向光源的单位向量;
N:物体表面的单位法向量;
四、镜面反射光
Ks为物体对于反射光线的衰减系数;
Shininess:为高光指数,具体是 pow(dot(V,R), shininess);
高光指数反映了物体表面的光泽程度。Shininess越大,反射光越集中,当偏离反射方向时,光线衰减的越厉害,只有当视线方向与反射光线方向非常接近时才能看到镜面反射的高光现象,此时,镜面反射光将会在反射方向附近形成亮且小的光斑;Shininess 越小,表示物体越粗糙,反射光分散,观察到的光斑区域小,强度弱。
Unity ShaderLab代码
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f { float4 pos : POSITION; float3 normal:TEXCOORD1; float4 vertex:COLOR; }; v2f vert(appdata_base v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.normal = v.normal; o.vertex = v.vertex; return o; } fixed4 frag(v2f IN) : COLOR { //Ambient Color fixed4 col = UNITY_LIGHTMODEL_AMBIENT; //Diffuse Color float3 N = UnityObjectToWorldNormal(IN.normal); float3 L = normalize(WorldSpaceLightDir(IN.vertex)); float diffuseScale = saturate(dot(N, L)); col += _LightColor0 * _MainColor * diffuseScale; //Specular Color float3 V = normalize(WorldSpaceViewDir(IN.vertex)); float3 R = 2 * dot(N, L)* N - L; float specularScale = saturate(dot(R, V)); col += _SpecularColor * pow(specularScale, _Shininess); float3 wpos = mul(unity_ObjectToWorld, IN.vertex).xyz; //compute 4 points lighting col.rgb += Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, unity_4LightAtten0, wpos, N); return col; }