目录
1.1.2 一个简单的着色模型:Blinn-Phong Reflectance Model
1.2 着色频率(Shading Frequencies)--怎么用
1.2.2 Gouraud Shading(每个顶点进行着色)
1. 着色(Shading)
在之前,我们已经学了这么几个事:
- 模型变换:将模型变换成我们需要的样子,比如机器人罗圈腿的姿势
- 视图变换:将摄像机放到规定好的位置
- 投影变换:将3D转换为2D图像
- 光栅化:在屏幕上显示相关信息
目前的工作可以得到的效果vs我们期待看到的效果
目前能呈现的状态都是物体的固有色,没有真实世界的光影感和体积感
为了让图像显示出来更加真实,我们需要对结果进行进一步的处理:着色。
1.1 着色(Shading)--是什么
1.1.1 着色的定义
在韦氏英文辞典里:用平行线或色块使图有明暗变化或是添加颜色变化。
在本课中:给一个物体添加材质的过程。
1.1.2 一个简单的着色模型:Blinn-Phong Reflectance Model
让我们先观察一个现实中的场景,其中存在:
高光区域
漫反射区域
环境光照,间接反光
建立着色模型需要一些定义
·观察方向v 、法线方向n 、光照方向l 、物体表面的属性(颜色、亮度等等)······
·只考虑单个物体表面,没有其他物体影响产生的阴影,也不会在其他物体的表面形成阴影。
(1)Blinn-Phong漫反射项
· 单位面积接受的光量
取决于法线方向与光源方向的夹角—即兰伯特模型
·光源强度
由光能量守恒 :
推出,即单位面积光强和其与光源的距离呈平方反比。
·漫反射模型计算公式:漫反射光强 = 漫反射系数 * 着色点实际接收到的光强
漫反射系数kd(常与材质颜色有关)变大的过程中,整体的颜色也越来越亮。
(2)Blinn-Phong高光项
高光强度取决于观察方向v,高光的反射方向会比较类似于镜面反射的方向R。
观察方向v和镜面反射的方向R足够接近的时候,就会看到镜面反射。这种计算方法是Phong模型的高光计算方法。Blinn-Phong的计算方法如下所示。
Blinn-Phong为什么很妙?
·半程向量h的计算比较容易,将 l 和 v 相加后除以它们和的模即可。
·而反射方向R的计算相比而言会更难,计算量会更大。
Blinn-Phong的高光项中的指数P是干什么的?
·通常来说,高光区域都比较小。为了控制高光区域,所以给点积项(在0-1之间的一个值)乘方,让高光区域变小。在Blinn-Phong模型中,P值一般取100-200。
(3)Blinn-Phong环境光照项
由于环境光照比较复杂,我们假设环境光强永远相同设为,环境光的颜色等属性都抽象为这个系数。那么环境光就等于这两个值相乘。
Blinn-Phong中的环境光和光方向和观察方向等都没关系,所以它带来的效果一般就是给物体加一层颜色,不让暗部死黑。但这是一种非常大胆简化,实际工作中会使用其他方案来优化。
(4)Blinn-Phong反射模型
Blinn-Phong反射模型 = 环境光 + 漫反射 + 高光
1.2 着色频率(Shading Frequencies)--怎么用
上述三个球使用的模型一样,但是因为着色频率不同,导致了不同的着色结果。
·每个平面做一次shading
·每个顶点对应一个法线,每个法线做一次shading,顶点组成的三角形内部进行插值填充
·每个顶点对应一个法线,这些法线的方向在三角形内进行插值,使得每个像素都对应一个法线,然后对每个像素上的法线进行shading。
1.2.1 flat Shading(每个三角形进行着色)
·计算每个三角形对应的法线比较容易:边向量叉积。然后对这个法线进行一次着色即可。
·平面着色带来的问题是,每个三角形面内只有一种颜色,边缘过渡比较生硬。
1.2.2 Gouraud Shading(每个顶点进行着色)
·顶点的法线方向是可以算出来的。
顶点法线的计算方法
如果是球就好办,顶点的法线方向就是顶点减去圆心位置所得到的向量。
如果不是球呢?
那就先计算出与目标顶点相邻的三角形的面向量
然后啊,对这些面向量进行平均或者加权平均。
1.2.3 Phong Shading(每个像素进行着色)
像素法线的计算方法
假设已经得到了顶点法线,那么就需要用到重心坐标,来插值出中间位置的法线方向,然后进行归一化。重心坐标之后再讲。
1.2.4 三种着色方法/频率的区别
当几何模型已经足够复杂,那么着色方法就可以使用简单点的平面着色。
反之,需要采用精细一些的着色方法,与此同时,计算量会更大一些。
要根据实际情况选择合适的方法。