什么是图形渲染管线
图形渲染管线是实时渲染的核心组件。渲染管线的功能是通过给定虚拟相机、3D场景物体以及光源等场景要素来产生或者渲染一副2D的图像。
如上图所示,场景中的3D物体通过渲染流水线转变为屏幕上的2D图像。渲染管线是实时渲染的重要工具,实时渲染离不开渲染管线。图形渲染管线主要包括两个功能:一是将物体3D坐标转变为屏幕空间2D坐标,二是为屏幕每个像素点进行着色。
图形渲染管线流程
渲染管线的一般流程如下图所示:
分为Application,Geometry Processing,Rasterization和Pixel Processing四个部分(这个是按照Real Time Rendering第四版来进行划分的)。
Application:图像在应用中的处理阶段,此时还是运行在CPU中,暂时还没有使用到GPU。此时,主要定义当下要构建世界的模型图元,对GPU中的各个Shader进行编程和参数设定,最后将图元和这些信息传递给GPU,GPU便可以帮助我们显示对应的每一帧。Application阶段结束以后,需要被渲染的渲染图元会被发送给Geometry Processing阶段由GPU进行进一步的处理(这里所说的渲染图元可以是点,线和三角形)。
Geometry Processing: GPU上的Geometry Processing阶段主要负责对输入的图元进行调整、修改、转换、增删等操作,在这整个阶段中,我们的处理对象是图元,输入的是图元,输出的还是图元。Geometry Processing也可细分成四个阶段:
- Vertex Shading Vertex Shading阶段主要有两件事情,一件是计算这些顶点的位置,将这些Vertex从模型空间转换到视角空间;另一件是根据程序员的指令,对这些顶点添加信息,或作出一些修改。Vertex Shader一定要计算每一个Vertex的position(位置),而其他的操作是可选项,由程序员在应用中进行定义。
- Projection 由于GPU最终是在屏幕上显示我们可以观看到的画面,所以Projection阶段需要决定我们的屏幕具体可以投影出什么内容。通常使用透视投影 (perspective projection)和正交投影 (orthographic projection)。
- Clipping 裁剪阶段,就是将视野范围外的物体全部剔除掉,最后将不再出现在屏幕上。
- Screen Mapping 屏幕映射阶段。
Rasterization: 光栅化的目的是将Geometry Processing处理后的得到的图元(primitives)转换成一系列的像素(即picture elements),以方便后续的Pixel Processing,最终输出到屏幕上。
上面是光栅化和像素处理两个阶段的的过程,可以看出在光栅化阶段又分为Triangle Setup 和 Triangle Traversal两个阶段
- Triangle Setup 将一个个图元组装起来,会计算图元的边方程和一些其他信息,也就是将各个点连接起来,组成真正的三角形(或者连成线);
- Triangle Traversal 为了将图元转换成像素,就需要识别每个图元覆盖了哪些像素;
Pixel Processing: 通过上述的Rasterization阶段,我们就拿到了各个图元对应的像素,最后这个阶段要做的事情就是给每个Pixel填充上正确的颜色,然后通过一系列处理计算,得到相应的图像信息,最终输出到显示器上。
- Pixel Shading 这个阶段的目的是给输入每一个Pixel赋予正确的颜色,这些颜色的来源可以是纹理、图元的顶点信息和光照信息等;
- Merging 到了Merging这一阶段,输入的每个Pixel都有相应的颜色信息,被存储在Color buffer,这一阶段就是要整合这些Pixel信息,以得到具体一帧的图像信息,这一阶段也被称作ROP。
最后连起来渲染流水线可表示为:
注:更多请参考《Real Time Rendering》第四版