OpenGL自制3D游戏引擎入门XII
Light Casters 投光物
我们目前使用的光照都来自于空间中一点,但现实世界中我们有很多种类的光照,每种的表现都不同。将光投射到物体的光源讲座投光物(Light Caster)。那么这一节我们将讨论集中不同类型的投光物,模拟不同种类的光源进一步丰富场景。
一、平行光
当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和观察者的位置如何,看起来所有的光都来自于同一个方向,当我们使用一个假设光源处于无限远处的模型时,她就被称为定向光,因为它的所有光线都向着相同的方向,它与光源的位置是没有关系的。定向光非常好的一个例子就是太阳光,太阳距离我们并不是无限远,但是它已经远到在光照计算中可以将其视为无限远了。
因为所用的光线都是平行的,所以物体与光源的相对位置是不重要的,因为对场景每个物体而言光线的方向是一致的,正因如此场景中的每一个物体的光照计算都会是类似的。
我们可以定义一个光线方向向量而不是位置向量来模拟一个定向光,着色器的计算基本保持不变,但这次我们将直接使用光的direction向量而不是通过direction来计算lightDir向量。
struct Light { // vec3 position; // 使用定向光就不再需要了 vec3 direction; vec3 ambient; vec3 diffuse; vec3 specular; }; ... void main() { vec3 lightDir = normalize(-light.direction); ... }
可以看到我们对light.direction进行取反,我们目前使用的光照计算需求一个从片段至光源的光线方向,但人们更习惯定义定向光为一个从光源出发的全局方向,所以我们需要对全局光照方向向量取反来改变它的方向,使之成为指向光源的方向向量并对其进行标准化
(つづく)
OpenGL自制3D游戏引擎入门XII
https://baifabaiquan.cn/2021/04/24/OpenGL入门XII/