这里回顾GAMES101 Lecture 8,着色(光照与基本着色模型)。

课程主页:

课程作业:

课程视频:

引子

上讲介绍了着色,即:

  • Blinn-Phong反射模型
    • 漫反射
    • 高光项
    • 环境光照
  • 备注:着色是指在特定的阴影点

本讲将继续介绍着色模型,具体来说,会介绍:

  • Blinn-Phong反射模型
    • 高光项和环境光照
  • 着色频率
  • 图形管道

漫反射项(Blinn-Phong反射模型)

漫反射的着色效果和$\mathbf v$无关,因为计算公式为:

高光项(Blinn-Phong反射模型)

高光项的强度取决于观察方向,在镜面反射方向很亮,注意到接近镜像方向的$\mathbf v$ ⇔ 半向量接近法线,接近程度通过单位向量的内积测量,图示如下:

计算公式:

符号说明:

  • $\mathbf h$:半程向量 ;
  • $k_s$:高光系数;
  • $L_s$:高光项;

$p$的作用调节高光项的影响,随着$p$增加,高光项的范围会变小:

环境光照项(Blinn-Phong反射模型)

环境光照是不依赖于任何物体的着色:

  • 添加恒定颜色;
  • 这是近似/错误的;

计算公式:

符号说明:

  • $k_a$:环境光照系数;
  • $L_a$:环境光照;

图示:

Blinn-Phong反射模型

将所有项结合,即可得到最终结果:

最终效果:

着色频率

从一个例子入手,什么原因导致着色效果的差异:

原因是着色频率不同,即:

  • 着色每个三角形;
  • 着色每个顶点;
  • 着色每个像素;

为每个三角形着色(平面着色)

平面着色:

  • 三角形面是平的,即三角形面共用一个法线向量;
  • 不适合光滑的表面;

效果:

对每个顶点进行着色(Gouraud着色)

Gouraud着色:

  • 根据三角形的顶点的结果进行插值;
  • 每个顶点都有一个法线;

对每个像素进行着色(Phong着色)

Phong着色:

  • 根据三角形的法线结果进行插值计算法线;
  • 计算每个像素的完整着色模型;
  • 不是Blinn-Phong反射模型

着色频率:面、顶点或像素

定义每个顶点的法线

之前讨论的内容遗留了一个问题,即如何定义每个顶点的法线,这里给出一些方案:

  • 最好从底层几何体中获取顶点法线

    • 例如,考虑球体
  • 否则必须从三角形面推断顶点法线

    • 简单方案:平均周围三角形面的法线

    • 计算方式为

图示:

定义每个像素的法线

假设知道多边形顶点的法线,那么该如何求出三角形内部每个顶点的法线呢?方法是使用重心插值(并归一化),具体方式后续会介绍。

图形(实时渲染)管线

图形管线是指从一开始的点到最后图片的过程,涵盖了课程到现在的所有内容:

之前介绍的内容涉及了管线的不同部分:

最后是纹理映射(后续介绍):

Shader Programs

  • 程序顶点和片段处理阶段;
  • 描述对单个顶点(或片段)的操作;
  • 着色器函数对每个片段执行一次;
  • 输出当前片段屏幕样本位置的表面颜色;
  • 着色器执行纹理查找以获取此时表面的材质颜色,然后执行漫反射光照计算;

图形管线实现:GPU

GPU是用于执行图形管线计算的专用处理器,是异构多核处理器。

纹理映射

我们希望在不同的位置有不同的颜色,由此引入了纹理的概念。纹理描述着色点的属性,例如可以指定不同位置的漫反射项的系数$k_d$:

那么如何表示着色点的不同属性?在此之前,我们首先要理解点在哪里?自然是在物体表面,这里有一个重要观点:每个3D表面点在2D图像(纹理)中也有一个位置。这一点可以从地球仪的例子进行理解:

纹理映射到表面后的效果

以一个例子来看纹理映射到表面后的效果:

左上是Blinn-Phong模型的效果,其右边是添加纹理后(贴图)的效果。(具体的实现类似指定表面和纹理的三角形对应关系。)

纹理坐标系

在贴图时涉及到坐标系,纹理中最常用的坐标系是$(u, v)$坐标系:

纹理可以使用多次

纹理可以复制使用,如果设计得当,可以做到无缝衔接: