图形管道
这里讨论一个简化的图形管道,不考虑动画和全局光照(如:阴影和辐射度)。此外管道中的数据流顺序也不是固定,为了优化可能会调整任务的提交顺序。
而且不详细探讨CPU和渲染硬件间的任务负担分配,但是正确组织渲染任务,以求达到最大的并行效果对高效渲染是至关重要的。
基本流程
- 建立场景
在进行渲染之前,需要设置场景中的参数,例如摄像机位置、选择进行渲染的起点--视点、渲染的输出--视图,另外还需要设置光照、雾化、z-缓存
- 可见行检测
设置好摄像机之后,就必须检查场景中哪些物体是可见的,不浪费时间去渲染不可见的物体
- 设置物体级的渲染状态
对于可见的物体,需要设置它的渲染状态,例如:纹理、材质
- 几何体的生成和提交
通过API,将几何体(通常是各种形式的三角形或独立的三角形,例如索引三角网格与三角带)提交到渲染硬件中渲染,这里可能应用LOD或者渐进式生成几何体
- 变换和光照
渲染API得到几何体的数据之后,由模型空间向摄像机空间的顶点坐标转换
以及顶点光照计算
即开始
- 背面剔除和裁剪
背对摄像机的三角形被去除(又称为“背部剔除”),在视锥体外部的部分也会被去除(又称为“裁剪”)--这可能会产生多边形
- 投影到屏幕空间
将3D裁剪空间中的几何体投影到2D屏幕空间里
- 光栅化
转换到屏幕空间之后就进入了光栅化阶段。光栅化指计算几何体哪些像素需要绘制
的过程,并为接下来的像素着色阶段提供合理的插值参数(如:光照和纹理映射坐标)
- 像素着色
在管道的最后阶段,计算三角形的色彩。接着把这些颜色写至屏幕,这时可能需要alpha混合
与z-缓存
伪代码
实现方式不同,渲染管道也不同,以下是上述流程的伪代码
参考
【1】细节层次