渲染流水线

说到流水线,大家可能会想到做工厂中生产物品的流水线工程。举一个例子,大家就会深刻的理解。

炒一份蛋炒饭可能需要经过:准备食材5分钟、炒饭5分钟、打包5分钟。总计15分钟。如果炒100份饭的话,可能会需要1500分钟,为了缩减时间,我们就提出了流水线的方法:将这三个步骤独立出来,就是准备3个人,路人甲负责准备食材、路人乙负责炒饭、路人丙负责打包。

所以说总结一点就是:流水线可以缩短需要批量流程(如炒饭等)的时间。

那么渲染流水线是什么呢?

答:批量生成一张张图像(最终呈现在屏幕上)的流程。

我们主要学习的就是如何生成一张图片的详细过程。

类比炒饭:准备那些食材,怎么炒饭、怎么打包?

渲染流程:如何生成一张图像,图像中的颜色如何设置等等。

渲染流水线的工作任务:从一个三维场景出发,生成(或者说渲染)一张二维图像。

👀️ 理解

CPU获取场景中模型的顶点数据(坐标)、纹理(映射顶点的颜色)等

CPU将获取的信息传递给GPU(调用Draw Call),通过GPU渲染到屏幕上。

渲染流程的三个阶段

渲染流程:应用、几何、光栅栏

应用:我们要摄像机照射到的区域里所有物体的信息。将这些信息转化为一个个的点、线、三角面等。

几何:处理这些顶点

光栅栏:上色

顶点着色器

CPU传过来模型的顶点信息Vector3[] vertices;

遍历这个vertices数组

GPU实际上不会如下面的代码一步一步的执行,而是所有顶点并行执行。(可以理解为开启多个线程

for(int i = 0; i < vertices.Length; i++){
	// 调用顶点着色器,将一个顶点的位置传入
	DrawVert(vertices[i]);
}

而顶点着色器会会处理这个顶点

  • 让这个顶点进行坐标变换(将顶点坐标从模型空间转换到齐次裁剪空间)

  • 让这个顶底沐浴光照(逐顶点光照

片元作色器

对一个片元进行着色。

有一个数组,存放的是一个片元里面的所有像素插值。

而片元着色器是对每一个像素插值进行处理