投光物

96
龙遁流
2017.01.12 22:04* 字数 1023

一个光源把光投射到物体上,叫做投光(Light casters)。

定向光

当一个光源很远的时候,来自光源的每条光线接近于平行。无论物体和观察者在哪儿看,就像所有的光线来自于同一个方向。当一个光源被设置为无限远时,它被称为定向光(Directional Light),因为所有的光线都有着同一个方向;它会独立于光源的位置。

定向光

点光源

定向光作为全局光可以照亮整个场景,但是另一方面除了定向光,我们通常也需要几个点光源(Point Light),在场景里发亮。点光是一个在空间里有位置的光源,它向所有方向发光,光线随距离增加逐渐变暗。想象灯泡和火炬作为投光物,它们可以扮演点光的角色。

点光源

光的衰减

随着光线穿越距离的变远使得亮度也相应地减少的现象,通常称之为衰减(Attenuation)

衰减值

常数项通常是1.0,它的作用是保证分母永远不会比1.0小。

一次项用于与距离值相乘,这会以线性的方式减少亮度。

二次项用于与距离的平方相乘,为光源设置一个亮度的二次递减。二次项在距离比较近的时候相比一次项会比一次项更小,但是当距离更远的时候比一次项更大。

衰减曲线

正确的衰减值的设置由很多因素决定:环境、你希望光所覆盖的距离范围、光的类型等。大多数场合,这是经验的问题,也要适度调整。

一些经验值

聚光

聚光(Spotlight)是一种位于环境中某处的光源,它不是向所有方向照射,而是只朝某个方向照射。结果是只有一个聚光照射方向的确定半径内的物体才会被照亮,其他的都保持黑暗。聚光的好例子是路灯或手电筒。

OpenGL中的聚光用世界空间位置,一个方向和一个指定了聚光半径的切光角来表示。我们计算的每个片段,如果片段在聚光的切光方向之间(就是在圆锥体内),我们就会把片段照亮。下面的图可以让你明白聚光是如何工作的:

聚光

LightDir:从片段指向光源的向量。

SpotDir:聚光所指向的方向。

ϕ:定义聚光半径的切光角。每个落在这个角度之外的,聚光都不会照亮。

θ:LightDir向量和SpotDir向量之间的角度。θ值应该比Φ值小,这样才会在聚光内。

聚光边缘的平滑和软化

为创建聚光的平滑边,我们去模拟的聚光有一个内圆锥和外圆锥。可以把内圆锥设置为前面部分定义的圆锥,我们希望外圆锥从内边到外边逐步的变暗。

为创建外圆锥,我们简单定义另一个余弦值,它代表聚光的方向向量和外圆锥的向量(等于它的半径)的角度。然后,如果片段在内圆锥和外圆锥之间,就会给它计算出一个0.0到1.0之间的亮度。如果片段在内圆锥以内这个亮度就等于1.0,如果在外面就是0.0。

我们可以使用下面的公式计算这样的值:

聚光亮度值

这里ϵ是内部圆锥(ϕ)和外部圆锥(γ)的差。结果I的值是聚光在当前片段的亮度。

聚光亮度示例

图片和一些文字来源于https://learnopengl-cn.github.io,本人收集作为笔记,如有侵权,望告知


OpenGL
Web note ad 1