图形 2.4 传统经验光照模型详解


传统经验光照模型详解


光照模型

  什么是光照模型?光照模型又称为明暗模型,用于计算物体某点处的光强(颜色值),从算法理论基础而言,光照模型分为基于物理和基于经验的。

基于物理的光照模型偏重于使用物理的度量和统计方法,效果非常真实,但是计算非常复杂,而且实现起来也比较困难。例:PBR

基于经验的光照模型则本质是对光照的一种模拟,通过实践和经验来总结出简化的方法,简化了真实的光照计算,并且能达到很不错的效果。例:Lambert,Billing-Phong。

不同光照模型的效果:

  那么我们为什么需要光照模型呢?因为现实世界的光照其实非常复杂,而且会受到诸多因素的影响,有限的计算能力无法完全模拟。使用简化的光照模型对现实的情况进行近似,使得计算处理起来会更容易,并且令效果更加符合需求。这些光照模型就是基于我们对光的物理特性的理解。

光照模型的发展:


局部光照模型

  局部光照模型并不是真正准确的模型,只关心直接光照,即只关心在光源–>物体–>人眼的过程中,仅存在一次反射而没有被其他物体反射过的,直接进入摄像头和人眼的光线。

局部光照模型的组成满足叠加原理,可以将基本光线分成:漫反射、高光反射、环境光、自发光。

漫反射:

  在光照模型的定义中,当光线从光源照射到模型表面时,光线均匀被反射到各个方向,这种现象就是漫反射。在漫反射的过程中,光线发生了发生了吸收和散射,而因此改变颜色和方向。

  漫反射光照符合Lambert定律,反射光强与法线和光源方向之间的夹角的余弦值成正比。

Lambert定律:一个面元的辐亮度或光亮度在其表面上半球的所有方向相等时,面元在与表面法线夹θ角方向的辐射强度或光强度等于其法线方向的辐射强度或光强度与cosθ的乘积。

即光源方向与表面法线方向越相似(),那么反射光线的强度越大。

漫反射效果与观察者位置无关,与光源位置有关。

高光反射

  当光线到达物体表面并发生了反射,观察视线在反射光线的附近时,便能够观察到了高光反射。高光反射描述了光线与物体表面发生的反射(光强不变,方向改变),其反射率是根据菲涅尔效应决定的,通常使用对应的反射贴图描述物体表面的反射率,并且使用光泽度(粗糙度,反光度)描述高光范围的大小。

不同光泽度下的高光效果:

环境光

  实际的环境光计算需要考虑的因素非常多,而且计算复杂,所以在局部光照模型中不考虑间接光照的计算。间接光照是指,光线通常会在多个物体之间反射,最后进入摄像机,也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。在标准光照模型中,我们使用了一种被称为环境光的部分来近似模拟间接光照。环境光的计算非常简单,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。

Cambient = Albedo * Ambientlight

  我们通常使用漫反射的反照率来指示环境光照的反射光量。该模型假定场景中发生多次散射和反射,并在所有方向上均等的射向目标物体。

 

自发光

  光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。标准光照模型使用自发光来计算这个部分的贡献度。它的计算也很简单,就是直接使用了该材质的自发光颜色:

Cemissive = Albedo * Emissivelight

  通常在实时渲染中,自发光的表面往往并不会照亮周围的表面,也就是说,这个物体并不会被当成一个光源。Unity5引入的全局光照系统则可以模拟这类自发光物体对周围物体的影响。

 

局部光照模型总体效果


 经典光照模型

经典光照模型包括Lambert模型,Phong模型,Blinn-Phong模型。

Lambert漫反射模型

  漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。漫反射中,视角的位置不重要,因为反射是完全随机的,因此可以认为在任何反射方向上的分布都是一样的。但是,入射光线的角度很重要。

  也就是兰伯特定律:反射光线的强度与表面发现和光源方向之间夹角的余弦值成正比。只有当入射光线与平面垂直的时候才能完整的接受所有的光能量,入射角度越倾斜,损失的能量越大。

光照公式:

color = Clight * albedo * dot(normal,L);

 

Phong模型

  Phong光照模型就是第一个有影响力的光照模型,考虑直接光照的反射作用,使用环境光代替间接光照。

Cfinal = Alight * mdiffuse + Clight * (mdiffuse * dot(l,n) + mspecular * dot(v,r)gloss)

Alight 环境光量
Clight 入射光量
mdiffuse 漫反射率
mspecular 镜面反射率
l 指向光源入射光向量
n 物体表面法线
v 观察方向向量
r 反射方向向量
gloss 光泽度

 

 

 

 

 

 

 

 

 

 

 

Blinn-Phong模型

  Blinn-Phong模型不再依赖于反射向量,而是采用了所谓的半程向量(Halfway Vector),即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近,镜面光分量越大。

Cfinal = Alight * mdiffuse + Clight * (mdiffuse * dot(l,n) + mspecular * dot(h,n)gloss)

 

  半角向量比反射向量的计算更加简洁,当光源与视线都在物体表面之上时,半角向量与发现向量的角度永远不会大于 90°   设想一种情况,当材质的反光度非常低,因此物体被光线照射的大部分区域都会发生高光反射。这些区域中一部分高光部分的反射向量与视线的家教超过了 90°   如果使用 Phong 模型就会导致高光区域一部分发生缺失。这是由于 Phong 模型只考虑视线与光照分布在法线两侧的情况。当视线与光照在法线同侧时且高光反射对高度有较大影响时,就会发生断层。  

着色方法

  上面我们介绍完了经典局部光照模型,其中主要利用了观察方向,入射光线与法线向量的位置关系,但并没有具体说究竟是三角形面的法线向量还是三角形顶点的法线向量,即我们要确认着色方式,如到底是逐顶点着色还是逐像素着色或是逐面着色。这三种着色方式对应着不同的表现效果。

Flat Shading

  面着色,即逐面进行着色,顾名思义以面作为一个着色单位。模型数据,大多以很多歌三角面进行储存,因此也就记录了每个面的法线向量,利用每个面的法线向量进行一次Blinn-Phong反射光照模型的计算,将该颜色赋予整个面,效果如下:

  逐面进行着色虽然计算很快,只需对每一个面进行一次着色计算,但是效果是很差的,可以很明显的看到一块块面的形状(实际上,这种LowPoly的风格比较适合做风格化的,更加卡通风格的场景,只是不适合用来给追求写实的画面使用),因此一种改进方法就是对三角形面的每个顶点进行着色,再对三角形面内的颜色插值,也就是高洛德着色方式(Gouraud Shading)。

Gouraud Shading

  Gouraud Shading(高洛德着色,逐顶点着色)会对每个三角形的顶点进行一次着色,我们需要将所有共享这个点的面法线加起来求均值,最后再标准化就得了该顶点的法线向量了。

  有了每个三角形的顶点向量之后,自然就可以计算出每个顶点的颜色了,那么对于三角形内部的每一个点应该怎么办?我们可以用重心插值坐标来计算,这样就能得到每个点的颜色,效果如下:

Phong着色模型

  我们既然能得到每个顶点的法线向量,那么对于三角形内部的每点的法线向量自然也可以像差值颜色一样得到,然后逐像素进行着色,三种着色方式的对比如下。

  

其实可以看到Phong Shading对于高光的显示相比于,Gouraud Shading是更真实的。有一点的要注意的是,这里所有的茶壶所使用的都是低精度模型,即模型的精度越高,逐顶点的效果更好。这里给出一张根据面数的增加,各个着色方法的对比。


作业

//TODO


参考

【技术美术百人计划】图形 2.4 传统经验光照模型详解

跳转回百人合集