常用光照模型

着色(shading)

着色往往是指向模型物体上色或添加材质特性的流程(不包含阴影的计算)

对于计算以某个点为反射点的反射向摄像机的光照,我们需要四个主要数据

  1. 视线方向,v
  2. 模型表面法线,n
  3. 光线方向(许多光线中的一条),l
  4. 模型表面性质(如,颜色,粗糙度等)

blinn-phong

在进一步计算时,我们先对效果进行分析,将效果拆分如下图为3个部分

分别为

  1. 镜面反射高光(Specular highlights):对于绝缘体而言其与高光对应,对于金属而言其与它本身的光对应
  2. 漫反射(diffuse reflection):来自于光在物体表面的散射现象
  3. 环境光(ambient lighting):光在物体之间弹射,最终在整个环境中形成的一个基本光

由此可见,一个物体在渲染后体现的颜色是这三种光的总和,即每个位置的颜色就是specular+diffuse+ambient

Diffuse Reflection

在计算漫反射时我们要考虑反射点接收了多少能量从而判断高光的亮度大小

根据lambert's cosine law,反射点吸收能量的多少与反射点法线和光线的夹角有关,即如图中表现的$\cos{\theta}=l\cdot n$

由此我们可以将漫反射总结为如下公式(lambertian Shading)

$L_d=k_d(I/r^2)max(0,n\cdot l)$

  1. $L_d$ : 我们想要的反射光线
  2. $k_d$ : 漫反射系数
  3. $(I/r^2)$ :到达反射点的能量值
  4. $max(0,n\cdot l)$ : 反射点接收的能量值
Specular Term(高光)

高光(Specular)指的是视线在一定的角度区域观看模型表面时会产生一个类似镜面反射的效果

如图中黄色区域为可见高光的视线范围

计算过程中需要引入一个半程向量(光线与视线夹角一半方向上的一个单位向量,半程向量与法线向量越接近,镜面反射强度越高)

$$ h=bisector(v,l) = \frac{v+l}{ || v+l || } $$

$$L_s=k_s(I/r^2)max(0,\cos \alpha)^p$$ $$\quad =k_s(I/r^2)max(0,n \cdot h)^p$$

$ k_s $ : 镜面反射系数 $ p $ : 高光的面积,P越大高光面积越小 $ L_s $ : 计算的高光效果光线

高光的效果和范围大小与$k_s$和p有关,下图展示了变化效果

ambient Term (环境光)

任何物体都可以反射光,这使得光在多个物体间弹射,最终会在环境中形成一个最基本的光,通常会被视为常量

!这是一个近似的效果(不符合物理)

$$L_a=k_a I_a$$

$k_a$ : 环境光系数,确定当前环境的底色

Blinn-phong Reflection Model

$$L = L_a + L_d + L_s $$ $$\quad = k_aI_a+k_d(I/r^2)max(0,n\cdot l)+k_s(I/r^2)max(0,n\cdot h)^p$$

当然这种方式会产生严重的塑料感,这种感觉可以通过调整参数来减少或避免,下次再述(挖坑)


渲染序列

渲染序列可以分为三种:

逐三角渲染(flat shading)

  1. 三角形面或一个法线向量视为是一个平面
  2. 对平滑表面的表现力不友好

逐顶点渲染(Gouraud shading)

  1. 根据三角形顶点对颜色进行插值计算
  2. 每一个顶点都有一个法线向量

  1. 如何获取逐顶点的法线向量
    1. 对于标准的几何图形:顶点的法线向量就在顶点位置
    2. 对于非标准的几何图形:包含该顶点的周围几个表面的法线取平均值,可由计算公式$$ N_v=\frac{\sum_{i}N_i}{\lVert \sum_{i}N_i \rVert}$$ 得到

逐像素渲染(phong shading)

  1. 对每一个三角形的法线向量插值(Barycentric interpolation)
  2. 对每一个像素计算完整的渲染模型
  3. 注意:非Blinn-Phong反射模型