点光源还有个重要的属性,就是光照范围,其也会影响到光照的衰减,在其光照影响范围之外的物体将不会受到点光源的影响。刚刚上面提到的衰减公式并没有考虑到光照范围对光强衰减的影响,在较新的unity版本中,其目前使用的衰减公式为: (1(d^2/r^2)^2)^2, r 为Light Range, d 仍然是光源和片元的距离,这是一个比较科学的衰减公式,其曲线大致为
衰减曲线
4、聚光
聚光
1)特点
聚光的工作原理跟点光源十分类似,除了聚光的照明区域会被限制在某个角度范围内,从而形成锥形的照明区域。值得一提的是,也跟平行光类似,聚光照明也是沿着其局部Z轴的(The center of the cone points in the forward (Z) direction of the light object)。锥形区域的覆盖角度(Angle)一般是小于180°的一个正值,聚光的光强在边缘会随着锥形区域角度的增加而衰减,角度越大,fade的区域也就越大,这就是所谓的“半影”(penumbra)。 2)衰减原理
一个片元是否被聚光影响,取决于聚光方向向量和光照向量之间的关系,前者获得的方式跟平行光类似,可以通过cull访问到,后者的话,可以通过片元位置跟光源位置的向量求得。上面提到了,聚光是有一个覆盖角度属性的,当这两个向量之间的夹角小于等于覆盖角度的一半时,那么该片元就会收到聚光的光照影响。聚光的衰减是按照角度平滑的衰减的,即Angle Falloff,聚光的衰减是从内角(inner spot angle)开始,并在外角(outer spot angle)处光强降为0。我们在unity编辑器里面配置的角度属性是outer angle,inner angle我们是没有办法配置的,但是内角和外角是有一个假设关系的,即 tan(ri)=46/64*tan(ro) ,其中 ri 是内角, ro 是外角,二者都是用弧度来表示的,根据这个关系,我们可以由外角来求出内角。
unity内置管线里面是用Light Cookie来做聚光光照衰减的,在可编程管线里面,是基于上述的内角与外角的假设关系来做衰减的,具体的衰减公式为: (Ds*Dl-cos(ro))/(cos(ri)-cos(ro)) ,其中DsDl是聚光方向向量与光照向量的点积,其大致的衰减图像为