渲染管线:顶点处理过程——光栅化过程——片元处理过程——输出合并操作。
光栅化阶段:根据顶点对多边形加以整合,并将各个多边形转换为片元集合。片元定义为一组数据,并对颜色缓冲区中的像素进行更行。
片元处理:对各个片元进行操作(如纹理操作),进而进行各种操作确定片元的颜色值。
输出合并:片元与颜色缓冲区中的像素进行比较或合并,进而更行像素的颜色值。
顶点操作包括转换操作、光照操作和动画操作。本章主要探讨顶点转化操作,并介绍顶点光照方式。第5章讨论顶点光照内容,第11章阐述顶点动画方式。
2.1世界转换
2.1.1仿射转换和齐次坐标
上图中的世界转换和视见转换取决于各种基本转换:缩放、旋转、平移。
缩放和旋转为线性转换,线性转换+平移操作统称为仿射转换。
平移操作通过向量加法描述,但是使用齐次坐标后能使用矩阵描述,所以缩放和旋转也要使用其次坐标下的矩阵形式
三维缩放矩阵——齐次坐标缩放矩阵
2D旋转矩阵——3D旋转矩阵——齐次坐标旋转矩阵
齐次坐标(x,y,z,w)对应于笛卡尔坐标(x/w,y/w,z/w)。齐次坐标的w项用于分辨向量和顶点数据,如果w为0,则(x,y,z,w)表示向量;否则表示顶点。
2.1.2世界矩阵
在右手坐标系中,比如绕Y轴旋转,箭头指向观察者,如果旋转角度为+90,则为逆时针;-90,则为顺时针。
旋转矩阵和平移矩阵相乘得到对应的4 X 4世界矩阵。左上方3 X3 矩阵表示组合线性转换,第四列表示组合平移操作。
2.1.3欧拉转换
当对象绕X Y Z轴进行连续旋转时,对象应具有确定方向。旋转角θx、θy、θz称为欧拉角。可以将3个旋转操作整合为一个旋转操作,该过程称为欧拉转换。
R(z) * R(y) * R(x)相乘得到单一矩阵。
2.1.4表面法线的转换
非均匀缩放操作会使法线转换出问题。详见图2.8例子。
解决方法:使用M矩阵的逆矩阵的转置矩阵来用于法线的转换操作。
2.2视见转换
世界转换操作完毕且全部对象均定义于世界空间内。随后可在世界空间内确定相机。
2.2.1相机空间
根据EYE、AT、UP三个参数来确定。(相当于拍照片时确定摄影师站立的位置,眼睛位置、模特位置、头歪向的向量)
构建相机空间(u,v,n),n = (EYE-AT)/|EYE-AT|;u = (UP x n)/|UP x n|;v = n x u;
2.2.2空间转换和视见矩阵
如果全部世界空间对象都重新定义于相机空间内,那么渲染算法的实现过程就会变得简单。这个过程被称为世界空间{O,e1,e2,e3}与相机空间{EYE,u,v,n}之间的空间转换,并可通过视见转换加以实现。
Mview = RT;
Opengl中gluLookAt用于创建视见矩阵。
2.3 逐顶点光照
源自光源的光线将通过对象表面进行反射并于随后到达相机处。
2.4投影转换
2.4.1视见体
场景中的可见区域称为视见体
Fovy定义垂直方向的可见区域。
Aspect:宽高比
N:近剪裁面
F:远剪裁面
近裁面和远裁面不符合真是相机和人类视觉系统原理,其存在原因仅处于计算效率考量。
外部视见体对象不会对最终图像结果产生任何影响。如果在进入GPU管线之前丢弃此类对象,则可大大提升计算性能——视锥体剔除操作。
2.4.2 投影矩阵
投影转换将金字塔视锥体转换为轴对齐2 X 2 X 1的立方体视见体。
根据fovy、aspect、n、f四个参数可以确定一个投影矩阵
Opengl和direct3d有一点不同,就是Z轴前者(-1,1),后者(0,1).