图形学光照

一、概述

现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此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 模型漫反射光照公式
图形学光照

参数说明:
LL:表面上的点指向光源向量
NN:法线
RR:光反射方向
rr:点到光源的距离
VV:点指向观察者方向
HH:半程向量(Halfway Vector 有部分教程称为半角向量),VVLL 的平分向量,由平行四边形法则可得 H=(V+L)/V+LH = (V + L) / || V + L ||
II:入射光的强度
kdk_d:漫反射系数

注:这里所有向量都是单位向量,如有多个光源则依次累加即可

  • 光强的衰减计算
    假设有一点光源向四面八方发射光线(球形辐射,计算时使用球表面积 S=4πr2S=4πr^2),在距离光源中心位置 1单位处强度为 II ,根据能量守恒可得
    图形学光照
    图形学光照
光强衰减示意图
  • 关于max(0, N·L)
    当 N 与 L 夹角大于 90 °,即光线无法从物体背面穿过,我们认为入射光对漫反射没有贡献。下图为相同能量照射在不同角度的平面,单位面积平面所获得能量示意图。正如太阳照射在地球各个区域的能量相同,热带地区接近太阳直射的地方获取的能量高,气温高。两极地区太阳光与地面法线夹角大,单位面积获得的能量少,气温也低。
    图形学光照

四、镜面光照

镜面光照(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。镜面光照是依据光的方向向量和物体的法向量来决定的,但是它也依赖于观察方向。当观察方向越接近反射方向 RR,受到高光的影响越大。
图形学光照

高光反射的强度与 VVRR 的夹角 cos\cos 值正相关,当夹角越大衰减越明显,但余弦函数的衰减不够理想,比如在 45° 时,现实中几乎看不到高光,cos45°\cos 45° 的值仍然很大。为修正这一误差,我们使用 cosα\cos \alpha 多次幂解决这个问题,下图为不同指数下的衰减对比。
图形学光照

综上可得 Phong 模型 高光公式为
图形学光照

  • Blinn-Phong 光照模型的改进
    Blinn-Phong 模型是对 Phong 模型的改进,因此也称 改进的 Phong 模型
    在Phong 模型中必须不断重新计算点积 RVR\cdot V,并且需要先求出反射方向 RR,在已知入射光 LL 和 法线 NN 的情况下要求 RR 相对麻烦。如果引进半程向量H(H=(V+L)/V+LH = (V + L) / || V + L ||),利用平行四边形法则可直接求出 HH。当 RR 越接近 VV 时,同样有 NN 越接近 HH,且有 NNHH 的夹角为 V 与 R 的夹角的一半。考虑到 HHNN 之间的角度小于 Phong 模型中使用的 RRVV 之间的角度(除非从非常陡峭的角度观察表面,否则该角度可能会更大),以及因为 Phong 正在使用 (VR)n(V·R)^n 优化,为使用 Blinn-Phong 更接近 Phong 的效果,同样使用 (NH)p(N·H)^p 优化,这里 p>np > n,当 p=4np = 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

欢迎关注个人公众号,实时推送最新博文!
图形学光照