一、概述
现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,“看起来像”就好了。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型 (Phong reflection model or Phong reflection model),冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:
二、环境光照
环境光照(Ambient Lighting)即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
把环境光照添加到场景里非常简单。我们用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色,然后将最终结果作为片段的颜色。下面是环境光计算公式
三、漫反射光照
漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact),其特点为把入射光向各个方向反射,理想的漫反射向各个方向反射的光线强度都相等(这里不考虑物体对光的折射和吸收),因此无论观察者在什么位置,看到的反射光线都是一样的。物体的某一部分越是正对着光源,它就会越亮,即当 L 与 N 越接近时越亮。(参照 Lambertian reflectance)
Phong 与 Blinn-Phong 模型漫反射光照公式
参数说明:
L
L
L:表面上的点指向光源向量
N
N
N:法线
R
R
R:光反射方向
r
r
r:点到光源的距离
V
V
V:点指向观察者方向
H
H
H:半程向量(Halfway Vector 有部分教程称为半角向量),
V
V
V 和
L
L
L 的平分向量,由平行四边形法则可得
H
=
(
V
+
L
)
/
∣
∣
V
+
L
∣
∣
H = (V + L) / || V + L ||
H=(V+L)/∣∣V+L∣∣
I
I
I:入射光的强度
k
d
k_d
kd:漫反射系数
注:这里所有向量都是单位向量,如有多个光源则依次累加即可
- 光强的衰减计算
假设有一点光源向四面八方发射光线(球形辐射,计算时使用球表面积
S
=
4
π
r
2
S=4πr^2
S=4πr2),在距离光源中心位置 1单位处强度为
I
I
I ,根据能量守恒可得
光强衰减示意图
- 关于max(0, N·L)
当 N 与 L 夹角大于 90 °,即光线无法从物体背面穿过,我们认为入射光对漫反射没有贡献。下图为相同能量照射在不同角度的平面,单位面积平面所获得能量示意图。正如太阳照射在地球各个区域的能量相同,热带地区接近太阳直射的地方获取的能量高,气温高。两极地区太阳光与地面法线夹角大,单位面积获得的能量少,气温也低。
四、镜面光照
镜面光照(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。镜面光照是依据光的方向向量和物体的法向量来决定的,但是它也依赖于观察方向。当观察方向越接近反射方向
R
R
R,受到高光的影响越大。
高光反射的强度与
V
V
V 和
R
R
R 的夹角
cos
\cos
cos 值正相关,当夹角越大衰减越明显,但余弦函数的衰减不够理想,比如在 45° 时,现实中几乎看不到高光,
cos
45
°
\cos 45°
cos45° 的值仍然很大。为修正这一误差,我们使用
cos
α
\cos \alpha
cosα 多次幂解决这个问题,下图为不同指数下的衰减对比。
综上可得 Phong 模型 高光公式为
- Blinn-Phong 光照模型的改进
Blinn-Phong 模型是对 Phong 模型的改进,因此也称 改进的 Phong 模型。
在Phong 模型中必须不断重新计算点积
R
⋅
V
R\cdot V
R⋅V,并且需要先求出反射方向
R
R
R,在已知入射光
L
L
L 和 法线
N
N
N 的情况下要求
R
R
R 相对麻烦。如果引进半程向量H(
H
=
(
V
+
L
)
/
∣
∣
V
+
L
∣
∣
H = (V + L) / || V + L ||
H=(V+L)/∣∣V+L∣∣),利用平行四边形法则可直接求出
H
H
H。当
R
R
R 越接近
V
V
V 时,同样有
N
N
N 越接近
H
H
H,且有
N
N
N 与
H
H
H 的夹角为 V 与 R 的夹角的一半。考虑到
H
H
H 和
N
N
N 之间的角度小于 Phong 模型中使用的
R
R
R 和
V
V
V 之间的角度(除非从非常陡峭的角度观察表面,否则该角度可能会更大),以及因为 Phong 正在使用
(
V
⋅
R
)
n
(V·R)^n
(V⋅R)n 优化,为使用 Blinn-Phong 更接近 Phong 的效果,同样使用
(
N
⋅
H
)
p
(N·H)^p
(N⋅H)p 优化,这里
p
>
n
p > n
p>n,当
p
=
4
n
p = 4n
p=4n 时,接近 Phong 的效果。
Blinn-Phong 模型 高光公式
五、光照公式
-
Phong 光照公式
-
Blinn-Phong 光照公式
六、Demo
源码地址:http://https://github.com/WarZhan/Graphics-Demo/tree/master/Lighting
参考链接
[1] 基础光照:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/
[2] Phong 光照模型:https://en.wikipedia.org/wiki/Phong_reflection_model
[3] Blinn-Phong 光照模型:https://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_reflection_model
[4] Lambertian reflectance:https://en.wikipedia.org/wiki/Lambertian_reflectance
[5] Games101 Lecture 07: https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_07.pdf
[6] Games101 Lecture 08: https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_08.pdf
欢迎关注个人公众号,实时推送最新博文!