本文简单梳理了实时渲染管线过程。主要参考了《RTR》3rd。
(更新ing)
概览
基本架构:三大阶段
- Application:CPU负责,把各种几何体信息输送到Geometry阶段,如点、线、三角形。
- Geometry
- Rasterizer
每一个阶段内部是次一级的管线。
Application阶段
这个阶段是不需要细分子管线的,因为是在CPU处理,假设是单线程,那么并没有管线处理的能力。不过可以用多核多线程,来实现并行计算。
Geometry阶段
细分:
model and view transform
简单地说,model transform用来控制对象在世界空间的位置、朝向、缩放等,而view transform和camera有关,camera决定了观察世界空间的角度(把世界空间转换到以摄像机为中心的摄像机空间),即决定了view transform。
vertex shading
顶点着色,不是必须,因为存在延迟渲染这种东西。pass。
projection
投影转换,作用是把处于view空间的顶点转换到规范化的view volume(也叫frustum)。规范化是指坐标范围会映射到[-1,-1,-1]到[1,1,1] 或者 [0,0,0]到[1,1,1]。
有两种投影转换,一是平行(正交)投影,二是透视投影。
clipping
裁剪的依据是:几何体的部分或全部在view volume里时,这个几何体才需要被送往光栅化阶段。
裁剪放在projection之后的好处是,裁剪时几何体都已在规范化的空间(unit cube)里了。
裁剪是硬件上实现的。
screen mapping
这一步把frustum下的x、y坐标转换到屏幕坐标(screen coordinate),如果算上z坐标就是窗口坐标(window coordinate)。
x、y会被缩放到(x1, y1)和(x2,y2)范围,而z坐标不变。这样转换后的x、y、z会被送往光栅化阶段。
(x1,y1)和(x2,y2)是像素坐标了,但像素坐标是整数,浮点数转换到整数有个取整问题。一般认为像素中心是在0.5的地方,例如假设(x1,y1)和(x2,y2)不小于0,那么最左像素的左边界是0,中心是0.5,右边界是1。
Rasterizer阶段
细分:
triangle setup
准备三角形数据阶段。硬件实现。
triangle traversal
首先这里出现了一个fragment的概念:fragment是指被光栅化阶段的三角形覆盖(全覆盖或部分覆盖)到的像素格子其中之一。
找出每个三角形的fragments,就叫triangle traversal,或叫scan conversion。
也是硬件实现。
pixel shading
这个众所周知了不做介绍。
merging
就是把pixel shading的输出合并到color buffer。
这个阶段不可编程,但可以配置。
其中要注意,depth test和stencil test发生在这个阶段。
资料
偶然google到了2份很不错的管线图:
写作不易,您的支持是我写作的动力!