DirectX11 聚光灯

聚光灯

1. 什么是聚光灯?

在现实生活中,最常见的聚光灯是手电筒。本质上,聚光灯由一个位置Q、一个方向向量d和一个圆锥体光照区域来描述(参见下图)。
DirectX11 聚光灯_第1张图片
(聚光灯由一个位置Q、一个方向向量d和一个半角角度为ϕmax的圆锥体照区域来描述。)

当实现一个聚光灯时,我们开始所做的事情与点光相同。光照向量可以由以下公式描述: 其中,P是接收照的点的位置,Q是聚光灯的位置。从图中可以看到,当且仅当, −L与d之间的角度ϕ小于圆锥角ϕmax时,P在聚光灯的锥形范围内(所以它可以接收光照)。另外,在聚光灯的圆锥体区域中的线应该具有不同的强度;越靠近圆锥体中心的光线应该越强,随着角度ϕ从0增加到ϕmax,光线强度应该逐渐衰退为0(零)。

2. 如何通过一个ϕ的函数来控制衰减强度,以及如何控制聚光灯的圆锥体区域大小?

其实很简单,我们只需要故伎重演,直接套用控制镜面高光圆锥体反射系数的公式即可。也就是,使用如下函数:

这里写图片描述

回顾下图所示的使用不同幂时的余弦函数曲线。
DirectX11 聚光灯_第2张图片

我们可以看到,当ϕ增加时,强度逐渐衰减,这是我们想要得到的结果;另外,通过修改指数s,我们可以间接地控制ϕmax(它是当光照强度降低为0时的圆锥体角度);也就是说,我们可以通过改变s来缩小或扩大聚光灯的圆锥体区域大小。例如,当我们将s设为8时,圆锥体的半角角度约为45º。这样,聚光灯与点光的方程基本相同,只是要再乘以一个聚光灯因子,根据点与聚光灯圆锥体的相对位置按比例调整光照强度:

这里写图片描述

注意:比较聚光灯公式和点光公式,我们可以看出聚光灯比点光耗费的资源要高得多,这是因为我们需要计算kspot因子。同理,比较点光公式和平行光公司,我们可以看出点光比平行光耗费的资源要高得多,这是因为需要计算距离d(这个计算涉及到平方根运算,非常耗时),而且需要除以衰减表达式。总而言之,从资源耗费角度而言,平行光要求最低,点光其次,聚光灯最高。

你可能感兴趣的:(2.,DirectX11龙书,学习笔记,DirectX11游戏开发)