UNITY_LIGHT_ATTENUATION, 光照衰减
用于计算光照衰减系数。参数一为返回值(光照衰减系数),参数二用于阴影计算,参数三是世界坐标
实现代码位于AutoLight导入文件之中,使用之前需要#include "AutoLight.cginc"
使用这个宏后,看起来衰减不再工作了。这是因为它有多个版本,每个光源类型都有一个。在默认情况下,它是为方向光源准备的版本,根本没有衰减。
正确的宏只有在知道我们正在处理的光源类型的时候才会被定义。如果处理点光源,我们必须在include AutoLight.cginc之前#define POINT。
如果需要适应各种类型的光照,可以使用#pragma multi_compile DIRECTIONAL POINT SPOT创建多个变体,unity会根据光源类型启用不同的关键字
处理点光源时候的源码:
_LightTexture0解析:https://blog.****.net/zengjunjie59/article/details/109532962
unity_WorldToLight :用于把顶点从世界空间转换到光源空间(https://blog.****.net/zengjunjie59/article/details/109533382)
lightCoord是顶点在光源空间下的坐标。用该坐标从_LightTexture0里提取衰减值,而UNITY_ATTEN_CHANNEL是r或者是a,这具体取决于目标平台。最后乘以阴影系数得到最后的光源衰减系数
处理聚光灯时候的源码
这里是它的代码。注意在采样掩码纹理的时候所做的从齐次坐标到欧几里得坐标的转换。在转换之后向uv坐标加上0.5,来确保(0,0)点在纹理坐标中央。
案例(转自catlikecoding)