1.高光计算:

假如模型是镜面模型,反射角对称入射角。那么入射光线为l,反射光线为R。当我们视角离R越近,就能看到高光,在Phong模型中,也是这么计算。
image.png
在Blinn Phong模型中,高光计算则是根据半程向量h(入射光线与视角的中间值,根据向量平行四面形算法可得出,即向量v+向量l/向量v+向量l的模)
image.png
注意在max(0,cosα)上还有一个指数p,这是因为如果没有这个指数,cos的函数取值范围会非常大,即高光范围会非常大,加上指数会降低高光的影响范围。(一般指数为100)
image.png
可以看到变化:
image.png

2.环境光计算:

假设认为任何一个点接收到来自环境的光永远都是相同的。强度= 08. Shading 2 (Shading, Pipline and Texture Mapping) - 图5
image.png
环境光是一个常数(指规定的数量与数字),基本就是一个颜色。它跟l,v,n无关。
这是一个fake效果。
Blinn Phong光照=环境光+漫反射+高光
image.png

3.着色频率:

着色频率主要有三种:面着色、顶点着色、像素着色。
image.png

左 Flat Shading:

把着色用到整个平面上,一个平面用一个shader。

中 Gouraud Shading:

每个顶点做一次着色,三角形内部的颜色用三个顶点进行插值。
Per-Vector Normal Vectors
每个面自带法线方向,如何才能知道每个顶点的法线方向呢?
image.png
很简单,就是求相邻面的平均值。
如果考虑到三角形的面积,进行加权平均那么得到的结果会更好

右 Phong Shading (不是Blinn-Phong 着色模型):

每个像素做一次着色,把顶点的法线求出后对三角形内部的每个像素进行插值求得像素的法线,然后运用sahder
Per-Pixel Normal Vectors
知道了顶点法线,那么怎么知道每个像素的法线呢。
image.png
用重心坐标。

总结

当然,着色频率要与几何密度一起考虑才是最终效果中性能最平衡的
image.png
当模型足够复杂的时候,flat可能就很好

4.渲染管线:

顶点、图元、片元、像素:

阶段1. 顶点 ->图元
几何顶点被组合为图元(点,线段或多边形),然后图元被合成片元,最后片元被转换为帧缓存中的象素数据。
阶段2. 图元 ->片元
图元被分几步转换为片元:图元被适当的裁剪,颜色和纹理数据也相应作出必要的调整,相关的坐标被转换为窗口坐标。最后,光栅化将裁剪好的图元转换为片元。
阶段3. 片元->像素
OpenGL允许光栅化生成一个片元,只要该片元通过一系列检测就可以修改帧缓冲区中对应象素。如果它通过测试,片元数据可以直接替换帧缓冲区中的已有值,或者和已有值合并,这取决于设置的模式。
象素:
在OpenGL流水线的上个阶段,片元转换为帧缓冲区中的象素。帧缓冲区实际上是一组逻辑缓冲区——包括颜色缓冲区、深度缓冲区、模版缓冲区和累积缓冲区。颜色缓冲区包括左、前右、后左、后右和一些辅助缓存值(auxiliary buffers)。
image.png
从三维场景到最后渲染的一张图的基本操作,都在硬件GPU里面写好的。
其中着色,Shading,在顶点处理阶段(VS)可以做,在片元阶段(PS或FS)也可以做
image.png
跟着色频率有关,如果用的Phong那就是在PS里面,如果是Gouraud Shading,那就是VS+PS

5.图片映射:

图片映射目前主流就是UV映射,把三维模型拆成二维平面,三维模型中的每个顶点对应到二维平面。
image.png
UV贴图中常用四方贴图(无缝贴图):
tilable texture 上下左右可以衔接
image.png