入门精要书中使用过两个函数计算worldLightDir,遂产生疑惑,两者区别在哪?
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
9.2.2节中Additional Pass中计算不同光源方向使用了下面的方式:
#ifdef USING_DIRECTIONAL_LIGHT
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
#else
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz);
#endif
如果判断是平行光,光源方向可以直接由_WorldSpaceLightPos0.xyz得到;
如果是点光源或聚光灯,那么_WorldSpaceLightPos0.xyz表示的是世界空间下的光源位置,想要得到光源方向,就需要使用这个位置减去世界空间下的顶点位置。
UnityWorldSpaceLightDir定义如下:
// Computes world space light direction, from world space position
inline float3 UnityWorldSpaceLightDir( in float3 worldPos )
{
#ifndef USING_LIGHT_MULTI_COMPILE
return _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w;
#else
#ifndef USING_DIRECTIONAL_LIGHT
return _WorldSpaceLightPos0.xyz - worldPos;
#else
return _WorldSpaceLightPos0.xyz;
#endif
#endif
}
//ps: #ifndef是if not define的简写
如果 _WorldSpaceLightPos0.w为0,表示该光源为平行光。
_WorldSpaceLightPos0.w为1。则表示光源为点光源或聚光灯。
总结如下:
1.如果光照为平行光,光源方向可以直接由_WorldSpaceLightPos0.xyz得到
2.如果不是平行光呢?若采用书中的方式未免有些复杂,该方法已经在UnityWorldSpaceLightDir中封装,直接调用即可。
3.显然使用UnityWorldSpaceLightDir(i.worldPos)来获取光源方向是更通用的方法。