光照模型
定义
- 光照模型(illumination model),也称为明暗模型,用于计算物体某点处的光强(颜色值)。
- 从算法理论基础而言,光照模型分为两类:
- 基于物理理论的光照模型:偏重于使用物理的度量和统计方法,效果非常真实,但是计算复杂,实现起来 也较为困难。例:PBR
- 经验模型:是对光照的一种模拟,通过实践总结出简化的方法,简化了真实的光照计算,并且能达到很不错的效果。例:Lambert,Billing-Phong。
为什么需要光照模型
- 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,有限的计算能力无法完全模拟。
- 使用简化的光照模型对现实的情况进行近似,使得计算处理起来会更容易,并且令效果更符合需求。
- 这些光照模型就是基于我们对光的物理特性的理解。
光照模型的发展
局部光照模型
定义
局部光照模型只关心直接光照部分,即直接从光源发出并照射到物体表面并反射至摄像头的光线。(不考虑间接光源)
局部光照模型的组成
局部光照模型满足叠加原理,可以基本将光线分为四个部分
- 漫反射
- 高光反射
- 环境光
- 自发光
漫反射
- 在光照模型的定义中,当光线从光源照射到模型表面时,光线均匀被反射到各个方向,这种现象就是漫反射
- 在漫反射的过程中,光线发生了发生了吸收和散射,而因此改变颜色和方向
- 漫反射光照符合Lambert定律,反射光强与法线和光源方向之间的夹角的余弦值成正比
-
在光学中通常使用辐射度来量化光
-
其中光源每秒发出的能量为辐射通量P
-
单位面积接收的光量为辐射通量密度(辐照度)P/A
-
当光源垂直照射的单机面积的辐照度为E1 = P/A1
-
将光束以某个角度照射到更大的平面上的辐射度为E2 = P/A2
-
可以认为A1与A2的关系是
-
简洁的来说:反射光线的强度与表面法线和光源方向之间的夹角的余弦成正比,值越大光源方向和法线方向越相似
-
光照公式:
-
漫反射的效果与观察者位置无关,与光源位置有关
-
高光反射(镜面反射)
-
当光线到达物体表面并发生了反射,观察视线在反射光线的附近时,便能够观察到了高光反射
-
高光反射描述了光线与物体表面发生的反射(光强不变,方向改变)
-
高光反射的反射率是根据一种菲涅尔效应的物理现象决定
-
通常使用对应的反射贴图描述物体表面的反射率,并且使用光泽度(粗糙度,反光度)描述高光范围的大小
-
计算公式如下:
- gloss表示了材质的光泽度
- specular表示了材质的反射光
- r表示反射光线
- v表示视角向量
不同光泽度下的高光效果:
环境光
- 实际的环境光计算需要考虑的因素非常多,而且计算复杂,所以在局部光照模型中不考虑间接光照的计算。
- 间接光照是指,光线通常会在多个物体之间反射,最后进入摄像机,也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。
- 在标准光照模型中,我们使用了一种被称为环境光的部分来近似模拟间接光照。环境光的计算非常简单,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。
- 通常使用漫反射的反射率来指示环境光照的反射光量
- 该模型假定场景中发生多次散射和反射,并在所有方向上均等地射向目标物体
自发光
- 光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。
- 标准光照模型使用自发光来计算这个部分的贡献度。它的计算也很简单,就是直接使用了该材质的自发光颜色
- 通常在实时渲染中,自发光的表面往往并不会照亮周围的表面,也就是说,这个物体并不会被当成一个光源。
- Unity5引入的全局光照系统则可以模拟这类自发光物体对周围物体的影响。
局部光照模型的整体效果
经典光照模型
Lambert模型
漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。漫反射中,视角的位置不重要,因为反射是完全随机的,因此可以认为在任何反射方向上的分布都是一样的。但是,入射光线的角度很重要。
也就是兰伯特定律:反射光线的强度与表面发现和光源方向之间夹角的余弦值成正比。只有当入射光线与平面垂直的时候才能完整的接受所有的光能量,入射角度越倾斜,损失的能量越大。
Phong模型
Phong光照模型就是第一个有影响力的光照模型,考虑直接光照的反射作用,使用环境光代替间接光照。
变量 | 描述 |
---|---|
环境光量 | |
入射光量 | |
漫反射率 | |
镜面反射率 | |
l | 指向光源入射光向量 |
n | 物体表面法线 |
r | 反射向量 |
gloss | 光泽度,控制高光反射区域 |
Blinn-Phong模型
Blinn-Phong模型不再依赖于反射向量,而是采用了所谓的半程向量(Halfway Vector),即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近时,镜面光分量就越大。
Phone模型和Blinn-Phone模型的区别
通过对Phone模型的公式和Blinn-Phone模型公式的对比,可以知道公式的不同之处在于使用了半角向量与法线的点积代替了反射向量与视线的点积结果。
半角向量的使用带来了什么变化?
- 计算更加简洁,半角向量比反射向量的计算更加简洁
- 当光源与视线都在物体表面之上时,半角向量与法线的角度永远不大于90度
- 设想一种情况,当材质的反光度非常低,因此物体的被光线照射的大部分区域都会发生高光反射。
- 这些区域中一部分高光部分的反射向量与视线的夹角超过了90度。
- 如果使用Phone模型就会导致高光区域一部分发生缺失。
- 这是由于phone模型只考虑视线与光照分布在法线两侧的情况。
- 当视线与光照在法线同侧时且高光反射对亮度有较大影响时,就会发生断层。
着色方法
上面我们介绍完了经典局部光照模型,其中主要利用了观察方向,入射光线与法线向量的位置关系,但并没有具体说究竟是三角形面的法线向量还是三角形顶点的法线向量,即我们要确认着色方式,如到底是逐顶点着色还是逐像素着色或是逐面着色。这三种着色方式对应着不同的表现效果。
Flat Shading
面着色,即逐面进行着色,顾名思义以面作为一个着色单位。模型数据,大多以很多歌三角面进行储存,因此也就记录了每个面的法线向量,利用每个面的法线向量进行一次Blinn-Phong反射光照模型的计算,将该颜色赋予整个面,效果如下:
逐面进行着色虽然计算很快,只需对每一个面进行一次着色计算,但是效果是很差的,可以很明显的看到一块块面的形状(实际上,这种LowPoly的风格比较适合做风格化的,更加卡通风格的场景,只是不适合用来给追求写实的画面使用),因此一种改进方法就是对三角形面的每个顶点进行着色,再对三角形面内的颜色插值,也就是高洛德着色方式(Gouraud Shading)
Gouraud Shading
Gouraud Shading(高洛德着色,逐顶点着色)会对每个三角形的顶点进行一次着色,我们需要将所有共享这个点的面法线加起来求均值,最后再标准化就得了该顶点的法线向量了。
有了每个三角形的顶点向量之后,自然就可以计算出每个顶点的颜色了,那么对于三角形内部的每一个点应该怎么办?我们可以用重心插值坐标来计算,这样就能得到每个点的颜色,效果如下:
Phong Shading
我们既然能得到每个顶点的法线向量,那么对于三角形内部的每点的法线向量自然也可以像差值颜色一样得到,然后逐像素进行着色,三种着色方式的对比如下。
其实可以看到Phong Shading对于高光的显示相比于,Gouraud Shading是更真实的。有一点的要注意的是,这里所有的茶壶所使用的都是低精度模型,即模型的精度越高,逐顶点的效果更好。这里给出一张根据面数的增加,各个着色方法的对比。
局部光照模型的URP实现
正常实现
1 | Shader "URPLearn/BaseShading" |
模仿PBR效果(用了几个Trick,并不基于物理)
1 | Shader "URPLearn/BaseShader" |
TASK
说出能量守恒的理念在基础光照模型中的作用
一束光打在物体上,最终回到人眼的有反射光和漫射光。能量守恒在这里最重要的一点是入射光的能量要大于等于出射光的能量,能量不可能凭空增加。最直接的呈现是画面不能越来越亮。
基础光照模型是基于经验总结的,由不同部分叠加而成,其漫反射部分认为光会被均匀地反射到不同的方向,并不遵循能量守恒的理念,渲染结果很大程度依赖于参数的搭配,好的参数可以接近基于物理观察的效果,不适当的参数给人第一眼很怪异。
而微表面模型是基于物理渲染的,其理论在很多大佬的文章中已提到,这里不过多赘述(引用中可查看)。总而言之我认为遵循能量守恒定律可以科学地让场景看起来更符合物理、更真实,而不用将重点放在调参以及一些HACK的实现方案。
基于能量守恒的理念,自己写一条完整的光照模型,需要包含环境光照
主要参考了以下文章,大佬解释的非常好。(TODO:增加软硬阴影支持、法线贴图支持)
1 | //=========金属/粗糙度工作流============= |
引用
- 课程链接1:bilibili.com/video/BV1B54y1j7zE/?p=2
- 课程链接2:bilibili.com/video/BV18h411C7sE
- GAMES202:bilibili.com/video/BV1YK4y1T7yY/?p=5
- learnopengl-基础光照:https://learnopengl-cn.github.io/02 Lighting/02 Basic Lighting/
- learnopengl-PBR:https://learnopengl-cn.github.io/07 PBR/01 Theory/#_3
- PBR 基于物理写实渲染:https://note.youdao.com/ynoteshare/index.html?id=45931e503a77cc50ff12a52dd412b13b&type=note&_time=1674020443123
- 大佬笔记1:https://www.yuque.com/u12120868/md8ze7/bl5ie8
- 大佬笔记2:https://www.yuque.com/xinghen-q7o8z/ru547n/zuw91o
- 大佬笔记3:https://www.cnblogs.com/anesu/p/15786470.html#/c/subject/p/15786470.html
- 大佬笔记4:https://blog.csdn.net/wsWind/article/details/120005768