小记渲染管线
小记渲染管线,不会涉及复杂的底层原理,仅供简单概念理解。
本文将以游戏中常见的3D模型渲染出画面的过程为例,讲述什么是渲染管线。
在了解渲染管线前
在电脑中,整个绘制工作一般由CPU指挥GPU进行——CPU会提供具体任务和数据,而GPU负责执行和计算。
为了绘制所要准备的那些数据
电脑所要渲染的三维物体,其实是由模型和材质贴图构成,而模型在电脑中则是由一个个点以及点上的数据(例如uv信息、法线等等),这些数据被称为顶点缓存(Vertex Buffer)。
由点可以构成面,但是很多面都是形状各异的,为此可以通过顶点组合的方式将面分成数个三角形面进行绘制,例如一个正方形可以通过选中4个顶点的3个绘制三角形,然后再绘制另一个三角形,组合起来便可形成一个完整的正方形,这样所有形状各异的面都会被分割成为数个可以绘制的三角形。
不过因为分解和绘制是分开的(CPU不会进行绘制),因此和顶点缓存一样,分出来的三角面的数据也要存储,具体些则是顶点组合需要存储,而在顶点组合中,记录的不是具体顶点的坐标,而是顶点的索引(代号),因此存储的数据会被称为索引缓冲(Index Buffer)。
除此之外,在游戏中还有摄像机相关的数据以及光照相关的数据需要一并准备。
还有一个更重要且较为耳熟能详的东西,就是着色器(Shader)——可以草率理解为一些用于对模型贴图进行处理的代码脚本。也是在绘制前需要准备的数据。
渲染管线
从CPU将绘制所需要的数据给GPU后,GPU通过对数据的处理并绘制的过程,则是渲染管线。
值得一提的是,广义上的渲染管线也包括了CPU准备数据的阶段。
开始绘制
GPU收到了CPU的数据,开始绘制,其中有几个重要的流程,下面会按顺序进行介绍。
顶点着色 Vertex Shader
在这一步,GPU会按照着色器里写的脚本对顶点缓冲里的数据进行额外处理。例如将模型的顶点坐标变换为屏幕上的坐标。
Triangle Processing
在这一步,GPU会绘制上面提到的三角形面。
光栅化 Rasterization
因为屏幕是一个个像素组成,因此GPU会将三角面变为具体的像素。
同时在这一步GPU会进行深度测试——也就是判断三角面之前的遮挡关系。
像素着色 Pixel Shader
在这一步,GPU会根据Shader给模型上材质或者是上光影效果。
Frame Buffer
在这一步,GPU会添加一些后处理手段,例如抗锯齿、辉光之类的效果。