本章学习如何实现一个聚光灯,让人用起来就像是镁光灯一样。由于聚光灯一般仅仅一个方向上的点光源,所以我们可以直接从点光源来构建代码。本章节是基于第一人称相机来构建的。
我们将给相机使用这个聚光灯。
聚光灯因子
聚光灯因子一般仅仅只是点光源附带一个方向而已。因此,我们会直接基于点光源的实现来构建,只在它的基础上添加一个方向,以及用一个值表示我们的聚光灯的椎体大小。
方向
在我们的代码中用一个3D向量dir来表示,第一个值是x轴,第二个值是y轴,第三个值则为z轴。
椎体
椎体用一个float值cone来表示。该值会是我们聚光灯方程式中的指数。通过改变这个值,我们可以改变聚光灯锥体的大小。一个小一点的值表示一大更大范围的锥体,一个大一点的值表示一个更小范围的锥体。
聚光灯方程式
记住,聚光灯是由点光源构建而成的,所以我们要做的只是添加一个额外的方程式,用来透过锥体在一个特定方向而不是向点光源一样向所有的方向发光
定义光的锥体
这是唯一的要加入效果文件的新方程式。这会创建一个锥体,我们的光线会透过它发光。
首先找到光线方向间的夹角,方向是从光线到像素的方向。我们使用点积来找到它。
随后我们使用max函数以确保我们没有获得小于0.0f的点积。一个小于0.0f的点积意味着位于聚光灯的位置之后,因此发光不仅仅是在聚光灯前面,也会在后面。
最终,我们使用带light的pow函数,cone作为函数银子。随之将完成用于定义我们的聚光灯的锥体方程式。
finalColor *= pow(max(dot(-lightToPixelVec, light.dir), 0.0f), light.cone);
光结构体
我们包含两个新的成员后就改变了光的结构