07-09.Shading, Pipeline and Texture Mapping
Shading: Shading,Pipeline and Texture Mapping
7.1 目前的进度和局限

能够用上面的方法绘制场景,即可做出如图的效果。但这样是不够的。我们想得到下面的效果

为什么会这样呢?为什么“相同”颜色的方块的每一面颜色不一致呢?容易发现,是环境光的影响。我们看到的物体画面是由物体本身和环境光共同作用得到的结果。所以需要考虑环境光。这个共同作用的方式,则体现出了物体的材质。
7.2 Shading 是什么

而
7.3 Blinn-Phong 模型介绍


类似于绘画中的三大面。可以把物体表面分为高光区域、漫反射区域、环境光区域。

需要注意的是,
7.4 Blinn-Phong 漫反射

- 材料的固有色,对应一个系数(可为颜色向量)$k_d$
- 反光点和光源的距离光源,距离越远亮度越底,对应于
$ 𝐼/𝑟^2$ - 表面法线与光线的夹角,夹角越大则单位面积能反射的光子理应越少,一旦大过
$ 𝜋/2$ 则意味着背光,不再漫反射。于是对应于$ 𝑚𝑎𝑥(0,𝑛∗𝑙)$

仅利用漫反射模型,且单一灰阶的固有色即可渲染出上面的效果。
8.1 Blinn-Phong 高光

再考虑高光项。高光对应于镜面反射,摄像机越接近光源的镜面反射的出方向,则应接受到越强的镜面反射光。度量这个“接近度”有一个聪明的比较容易的计算的方法,是比较光源方向和摄像机方向的中间方向(很容易计算)和法线方向的夹角,夹角越大则越不接近。
且对于这个接近度可以取一个次数


加入了高光项后,可以得到上图效果,且可以看出两个参数在调整时对结果的影响。
8.2 Blinn-Phong 环境光

最后,对于暗部,并不希望全黑,所以可以加入环境光项,当然,并没有办法保证有光,也不可能环境光处处相同,所以这只是个不符合物理的趋近方法

最后综合 漫反射、高光、环境光 三项后可以得到上图效果。
8.3 Shading 频率

同样是应用
- 低频:面向三角形
- 中频:面向顶点,三角形内部应用重心坐标差值
- 高频:面向像素

面向三角形的

对顶点着色,并应用差值:

对每个像素着色。这里的

这几种着色频率对应足够高面的模型而言表现是近似的。所以如果足够多面,应优先选择更低频的着色方式,减少计算量。

对逐顶点着色而言,是需要获得顶点的法线的。可以采用相邻三角形法线的简单平均,或者根据三角形面积加权平均。

对逐像素着色而言,则需要获得每个像素的法线方向,通常使用自己和附近面的法线用一些方式加权平均。
8.4 渲染管线

将一次渲染分成几步,大部分集成在

比如一开始先处理顶点(等效于处理三角形,因为三角形被顶点决定)


对片面的测试和处理(也可以算作光栅化的一部分)


纹理映射也属于

纯靠
8.5 纹理映射

将二维的表面和一张二维的图逐点一一对应:

一些纹理是可以上下左右拼接的,做到重复利用。
9.1 三角形重心坐标


用对面三角形面积占比计算:

9.2 应用纹理

直接采样,又会有锯齿问题。可以通过双线性插值

双线性插值的方法:

当纹理过大也会有问题,问题源自一个像素对应了纹理上太多像素:


超采样可以解决,但计算量过大:


使用

可以用相邻两个层级进行线性插值:

得到更好的结果:

不过

这是由于

所以后来还有
10.1 贴图的其他应用

记录环境光

环境光可以记录在球上,但球的两极会有扭曲,所以一般记录在正方体的表面

还可以记录表面相对高度,即凹凸贴图(与法线贴图目标近似,但计算和优势不同)

二维上计算法线的方式是查分求导再旋转。

三维也类似

还可以在处理顶点时事实地改变顶点位置。
不过这要求模型的精细度足够高,以保证有足够多的顶点可以随贴图改变。目前

纹理也可以是

还可以用于预烘培,提前计算一些阴影啥的

或者记录三维信息