着色Shading(2)(着色的继续、管线和纹理映射)(笔记)



前言

继续讲完Blinn-Phong着色模型,再开始讲着色频率(Shading frequencies)和图形管线(Graphics pipeline)。


四、高光项(Specular Term)

高光是什么

在这里插入图片描述
在比较光滑(或者绝对光滑)的物体表面上,反射接近镜面反射,当观察方向接近镜面反射方向时,我们可以观察到高光。

Blinn-Phong高光项

在这里插入图片描述
在Blinn-Phong中做了一个有关高光项的假设。简单来说,观察方向v接近镜面反射方向r就等同于半程向量h(half vector)接近于法向n。也就是说,是否看到高光我们只要判断半程向量和法向量是否接近就可以了。
上图的公式中,ks表示镜面反射系数(Specular coefficient)。
之所以要使用半程向量来计算,是因为半程向量相对于反射方向而言太好算了。
在这里插入图片描述
上图为公式中的指数p与反射波瓣(reflection lobe)的关系。这反映了高光的“大小”。
在这里插入图片描述
从上图可以看出,镜面反射系数越大,高光越强,p越大,高光越“小”。

五、环境光照项(Ambient Term)

环境光照是什么

环境光照,也就是从其他物体反射的光再反射到着色点上,也就是来自环境的光。这样的光照就是环境光照。
环境光照能让没有被光线直接照射的部分也能被看到(字面意思)。
可以想象环境光照要是按照实际情况来计算会非常复杂,所以在Blinn-Phong模型中我们假设任何一个点接收到的来自环境的光永远都是相同的。
在这里插入图片描述
根据公式,环境反射光等于环境光照系数乘以环境光强(也就是接收到的环境光)。
环境光不关心从哪里来,也不关心在哪个方向看,不管在哪个方向看,得到的结果应该是一样的。可以认为,环境光就是一个常数,就像给物体蒙一层颜色。
事实证明,以上假设非常不精确,如果要得到一个更精确的环境光,我们需要用到全局光照(Global illumination)技术。

六、Blinn-Phong反射模型的总结

Blinn-Phong反射模型


Blinn-Phong光照反射等于环境光加漫反射加高光

七、着色频率(Shading Frequencies)

一个小问题

在这里插入图片描述
这几个球的形状很明显是一样的,是什么导致了着色的不同。

平面着色(Flat Shading)

在这里插入图片描述
只给每一个三角形着色,每一个三角面只有一个法向量,效果看起来不咋地。

高洛德着色(Gouraud Shading)

在这里插入图片描述
为每一个顶点求法线(不知道怎么求),之后再为每一个顶点着色,然后根据每一个顶点的颜色通过插值计算三角形内部的颜色。

Phong Shading

在这里插入图片描述
通过插值得到每个三角形覆盖的每个像素的法向量,再在每个像素计算完整的着色模型。并不是Blinn-Phong反射模型。Phong Shading是一种着色频率。

不同着色频率的比较

在这里插入图片描述
可以看到,当顶点数量越来越大时,三种着色频率差别就不大了。也就是说,当面比较多的时候,我们就不再需要通过比较复杂的逐像素的频率来进行着色也能得到很好的效果。
但是话说回来,如果面实在是太多了,以至于超过了像素数,那逐面的shading对比逐像素的shading不仅区别不大,还需要更多的计算。

每个顶点的法线如何定义

在这里插入图片描述
最好的方法是能够通过基本几何体(underlying geometry)来得到顶点法线。比如说一个圆。
在这里插入图片描述
否则就只能通过三角面法线来推断出法向量。具体方法是,通过顶点相邻的三角面法线求(面积加权)平均(也就是某个相邻三角面面积越大对平均的贡献越大)来得到。当然,加权平均的结果更准确。
在这里插入图片描述
知道顶点法线之后,对顶点法线进行重心插值(Barycentric interpolation)可以得到三角形内部的平滑过渡的法线。求完以后别忘了将插值归一化(normalize)。

八、图形管线(Graphics Pipeline)

图形管线是什么

在这里插入图片描述
简单来说,从模型场景到最后显示在显示器上的一张图,中间经历的一系列过程叫做图形管线。
在这里插入图片描述
MVP(Model, View, Projection)变换发生在顶点处理阶段
在这里插入图片描述
采样发生在光栅化阶段。
在这里插入图片描述
深度缓存可见性测试发生在片段(Fragment)处理阶段,片段可以理解为光栅化之后的一个个像素。
在这里插入图片描述
考虑到不同着色频率,shading发生在顶点和片段处理阶段。比如Phong Shading就只能等到片段产生后才能进行,而Gouraud Shading有顶点就能进行。
在这里插入图片描述
纹理映射发生在顶点和片段阶段,纹理映射的具体内容之后会讲。

Shader Programs

在这里插入图片描述
Shader是处理顶点和像素着色的代码。Shader是通用的,每一个顶点或者像素都会执行Shader代码(也就是说不需要你写for循环)。如果写的是顶点的操作,这个Shader就叫做Vertex Shader(顶点着色器),如果是像素的操作,这个Shader就叫做Fragment/Pixel Shader(像素/片段着色器)。
在这里插入图片描述
上图为GLSL(OpenGL)的Fragment Shader代码示例。演示了一个最简单的Phong模型漫反射。
推荐网站ShaderToy,能够快速上手练习Shader代码。

九、现代图形学的发展科普

高复杂的实时三维场景渲染

在这里插入图片描述
比如游戏引擎。

图形渲染管线的硬件实现:GPUs

在这里插入图片描述
执行Shader代码的硬件。可以将GPU理解成一个高度并行的处理器。虽然GPU的每一个计算单元的计算能力不强,但是有很强的同时计算能力,特别适合用于图形计算。

十、纹理映射(Texture Mapping)

任何一个三维物体的表面都是二维的

在这里插入图片描述
想象一个地球仪,我们将他表面的地图“撕下来”,得到的就是一张图。也就是说,物体的表面可以和一张二维图片有对应关系。

纹理(Texture)

纹理就是一张二维图。

纹理映射(Texture Mapping)是什么

在这里插入图片描述
简单来说,把一张图“贴”到三维物体表面的过程就叫纹理映射。对于图形工程师来说,每个三角形映射到纹理的哪个部分是已经确定的。至于这张纹理该怎么画,那是艺术家的事情。

纹理坐标

在这里插入图片描述
每个三角形顶点都被赋予了纹理坐标(u, v)。为了方便处理,无论纹理的图片长宽比和分辨率如何,都认为u和v的范围是0到1。
在这里插入图片描述
纹理可以想贴瓷砖一样贴在各种物体上。并且能够被重复使用很多次。
在这里插入图片描述
对于设计良好的纹理,在重复使用时也能显得很正常,这种纹理被称为tiled。

课程的最后

需要注意一点,到目前为止,观察点和着色点的距离并不影响光衰减。而光源和着色点的距离有光衰减。这个以后会提到。

在这里插入图片描述
下节课预告,三角形内插:重心坐标(Interpolation Across Triangles : Barycentric Coordinates)。讲一讲三角形的内部与纹理该怎么对应。

猜你喜欢

转载自blog.csdn.net/qq_37856544/article/details/113177581
今日推荐