GAMES102 Lecture 8 Shading 2 (Illumination Shading and Graphics Pipeline)
这里回顾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)$坐标系:
纹理可以使用多次
纹理可以复制使用,如果设计得当,可以做到无缝衔接: