一、概述
现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此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
欢迎关注个人公众号,实时推送最新博文!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/96326.html