用于计算光照衰减系数。参数一为返回值(光照衰减系数),参数二用于阴影计算,参数三是世界坐标
实现代码位于AutoLight导入文件之中,使用之前需要#include "AutoLight.cginc"
使用这个宏后,看起来衰减不再工作了。这是因为它有多个版本,每个光源类型都有一个。在默认情况下,它是为方向光源准备的版本,根本没有衰减。
正确的宏只有在知道我们正在处理的光源类型的时候才会被定义。如果处理点光源,我们必须在include AutoLight.cginc之前#define POINT。
如果需要适应各种类型的光照,可以使用#pragma multi_compile DIRECTIONAL POINT SPOT创建多个变体,unity会根据光源类型启用不同的关键字
处理点光源时候的源码:

_LightTexture0解析:https://blog.csdn.net/zengjunjie59/article/details/109532962
unity_WorldToLight :用于把顶点从世界空间转换到光源空间(https://blog.csdn.net/zengjunjie59/article/details/109533382)
lightCoord是顶点在光源空间下的坐标。用该坐标从_LightTexture0里提取衰减值,而UNITY_ATTEN_CHANNEL是r或者是a,这具体取决于目标平台。最后乘以阴影系数得到最后的光源衰减系数
SHADOW_ATTENUATION(input) 与接受阴影有关,解析:https://blog.csdn.net/zengjunjie59/article/details/111356636
处理聚光灯时候的源码
这里是它的代码。注意在采样掩码纹理的时候所做的从齐次坐标到欧几里得坐标的转换。在转换之后向uv坐标加上0.5,来确保(0,0)点在纹理坐标中央。

处理点光源cookie时候的源码
在这种情况下,UNITY_LIGHT_ATTENUATION是什么样子的?
它相当于常规点光源的宏,除了它也采样cookie以外。由于在这种情况下cookie是一个立方体贴图,所以它使用texCUBE做采样。

案例(转自catlikecoding)

本文介绍Unity中不同光源类型的光照衰减系数计算方法。包括如何通过宏定义选择正确的衰减公式,适应点光源、聚光灯等,并展示了如何利用Unity内置函数进行空间坐标转换及衰减取样。
2299

被折叠的 条评论
为什么被折叠?



