一、对最终像素颜色进行叠加,混合等并输出。
二、计算光照。
通常情况下关照的计算也会在这部分进行计算,虽然在顶点部分进行计算也可以,但是在这里计算的话效果能更好,当然也更加消耗性能。前面的文章有介绍过。
- 1、光照准备
float3 nDir = i.nDirWS; // 获取世界空间下法线方向
float3 lDir = _WorldSpaceLightPos0.xyz; // 获取光照方向
float nDotl = dot(i.nDirWS, lDir); // nDir点积lDir
float halfLambert = nDotl * 0.5 + 0.5; 获得兰伯特光照
float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz); //获得观察方向
float3 hDir = normalize(vDir + lDir);//获得半角方向,光照方向和观察方向的中间角方向
float ndoth = dot(nDir, hDir);//获得反射光照
float blinnPhong = pow(max(0.0, ndoth), _SpecularPow);//获得blinnPhong 反射
float3 rDir = reflect(-lDir, nDir);//获得反射方向
float vdotr = dot(vDir, rDir);//获得反射光照
float phong = pow(max(0.0, vdotr), _SpecularPow);
-2、采样
// 采样Occlusion贴图
float occlusion = tex2D(_Occlusion, i.uv);
- 3、增加投影
float shadow = LIGHT_ATTENUATION(i);
网友评论