计算worldLightDir的两个函数

入门精要书中使用过两个函数计算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)来获取光源方向是更通用的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Codelk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值