计算机图形学笔记---GPU图形绘制管线
暑假到啦,大三博主选了可视化方向,就想着在暑假提前进行学习啦。而且哦,博主前几天偶然看到了一个研究生小姐姐写的关于shader的特别棒的博客教程,简直像个天使!博主觉得如果自己在学习过程中记录下的笔记也能帮助到其他人,给大家一个大致的框架与总结,那就再好不过了。所以,出于抛砖引玉的本意,博主觉得不能这样懒啦!要更博,努力记录下重点,同时也能激励下自己嘛φ(>ω<*) 好的,我们一起加油!
呃作为学习笔记的博客在排版上可能不会很美观,图片也不会很有趣,(毕竟博主看著作要消耗很多时间qwq)但文字都是干货,其中还有一些自己的理解。
图形绘制管线 分为三个主要阶段:
应用程序阶段——用高级编程语言进行开发,主要和CPU和内存打交道,执行的有碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法。在该阶段末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传递到图形硬件(时间瓶颈)
几何阶段——主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段末端可以得到经过变换和投影后的顶点坐标、颜色、以及纹理坐标。
光栅阶段——基于几何阶段的输出数据,为像素正确配色,绘制完整图像 进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器中
注意:光照计算属于几何阶段,因为涉及视点、光源、物体的世界坐标;
雾化以及涉及物体透明度的计算属于光栅阶段,因为都需要深度值信息(在几何阶段计算从而传递到光栅阶段)
- 几何阶段
坐标空间(类型)——模型坐标空间、世界坐标系空间、观察坐标空间、屏幕坐标空间
从object space到world space(必须与一个固定的坐标原点进行参照)
object space coordinate 是模型文件中的顶点值,建模时得到;与其他物体无参照关系
从object space coordinate到world spacecoordinate 转换由一个四阶矩阵控制——world matrix
光照计算在世界坐标中进行
注意:顶点法向量在模型文件中属于 object space,在GPU的顶点程序中必须将法向量转换到world space中才行,其转换矩阵是world matrix的转置矩阵的逆矩阵
从world space到eye space
*在计算机中每次只能从唯一的视角出发渲染物体
eye space 以视点或相机为原点,由视线方向、视角和远近平面共同组成一个梯形体的三维空间,称之为视锥(viewing frustum)
梯形体较小的近平面是投影平面;梯形体较大的远平面
此梯形体中所有顶点数据可见,超出之外的场景数据会被视点去除(frustum culling视锥裁剪) 裁剪clip
从eye space 到project and clip space
多边形裁剪在CVV中进行;投影与剪裁的先后?
CVV(canonical view volume)规范立方体–一个单位立方体,对角顶点分别是(-1,-1,-1),(1,1,1)
它的近平面的x,y坐标对应屏幕像素坐标,z坐标则代表画面像素深度
两个空间转换的步骤——
1.用透视变换矩阵把顶点从视锥体中变换到裁剪空间的CVV中—这才是所说的投影,主要有正投影(平行投影)和透视投影
2.在CVV中进行图元裁剪
3.屏幕映射:将前述过程得到的坐标映射到屏幕坐标系上
当一个图元 (图元指的是图形数据,所对应的就是绘图界面上看得见的实体)完全位于视体内时,可以直接进入下一个阶段;完全在外部的被剔除;对部分位于视体内的进行裁剪
对裁剪算法的理解——为减少需要绘制的顶点个数,而识别指定区域内或指定区域外的图形部分的算法,主要包括:视域剔除、背面剔除、遮挡剔除、视口裁减等
Primitive Assembly 图元装配——将顶点根据原始的连接关系还原出网格结构。
网格由顶点和索引组成,在之前的流水线中是对顶点的处理,这里是根据索引将顶点链接在一起,组成线、面单元。然后对超出屏幕的三角形进行裁剪(处理三角形的过程Triangle Setup)
三角面片的法向量朝向视点(法向量与视点方向的点积为正)——正面!若是反面,则进行背面剔除
最后得到一堆在屏幕坐标上的三角面片(用于做光栅化的)
- 光栅化阶段
光栅化:决定哪些像素被集合图元覆盖的过程(将顶点以及绘制图元对应到像素)
点的屏幕坐标值(浮点数)四舍五入得到像素位置(整数点)
那如何处理像素?给其赋颜色值呢?
Pixel Operation(Raster Operation)— 在更新帧缓存前,执行最后一系列对每个片段的操作;目的是计算出每个像素的颜色值 在这个阶段,被遮挡面通过深度测试消除
所做的工作包含——
1)消除遮挡面
2)Texture operation 纹理操作 根据像素的纹理坐标查询对应纹理值
3)Blending混色 目前颜色+正计算的颜色的透明度Alpha(alpha混合技术 0为透明)
4)Filtering 将正在算的颜色经过某种滤波或者滤镜输出==经过一种数学运算后变成新的颜色值
在该阶段后,像素的颜色值被写入帧缓存
Z Buffer(depth buffer)深度缓冲区 存放深度值(视点到每个像素所对应的空间点的距离衡量)
接近眼睛的Z值为0.0,远裁减面上为1.0 可以用其来判断空间点的遮挡关系
在透视投影中同一图元相邻像素的Z值并不是线性关系,非线性程度随空间点到视点增加越发明显,Z值决定了物体之间的相互遮挡关系
Z-fighting(flimmering)——没有足够的精度,两个相距很近的物体会出现随机遮挡的现象
Stencil Buffer 模板缓冲区 通常附加到z buffer中,用来做记号 eg.在一个像素的Stencil Buffer中存1,表示该像素对应空间点处于阴影体(shadow volume)中
Frame Buffer 帧缓冲器——用于存放输出数据,一般是像素颜色值 在显卡或内存上;有时被认为是颜色缓冲器和Z Buffer的组合