什么是渲染流水线
在RTR4中,将渲染流程分为3个概念阶段:应用阶段、几何阶段、光栅化阶段。
应用阶段
- 由CPU负责实现
- 准备场景数据,例如摄像机位置、视锥体、场景模型、使用光源等
- 粗粒度剔除
- 设置每个模型的渲染状态(材质、纹理、Shader等)
- 输出渲染所需几何信息,即渲染图元。通俗来讲,渲染图元可以是点、线、三角形等
几何阶段
- 由GPU负责实现
- 决定绘制的图元是什么,怎样绘制,在哪里绘制
- 将顶点坐标转换到屏幕空间中
- 输出屏幕空间的二维坐标、每个顶点的深度值、着色等相关信息
光栅化阶段
- 使用上个阶段传递的数据产生屏幕上的像素
- 对上一阶段得到的逐顶点数据(纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理
CPU与GPU之间的通信
渲染流水线的起点是CPU,即应用阶段。应用阶段大致可分为:
- 把数据加载到显存中
- 设置渲染状态
- 调用DrawCall
把数据加载到显存中
所有渲染数据都需要从硬盘中加载到系统内存,然后,网格和纹理等数据又被加载到显卡上的存储空间——显存中。这是因为显卡对显存的访问速度更快,而且大多数显卡对RAM没有直接访问权利。
设置渲染状态
渲染状态的通俗解释是,这些状态定义了场景中的网格是怎样被渲染的。例如使用了哪个顶点着色器/片元着色器、光源属性、材质等。如果没有设置渲染状态,那么所有网格都将使用同一种渲染状态。
在准备好上述工作后,CPU就需要调用一个渲染命令告诉GPU按照设置来渲染了。这个命令就是DrawCall。
调用DrawCall
DrawCall就是一个命令,发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的图元列表,而不会再包含任何材质信息(因为已经在上一阶段中完成了)。
当给定一个DrawCall时,GPU就会根据渲染状态(例如材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输出屏幕上显示的像素。这个过程就是GPU流水线。
GPU流水线
对于概念阶段的后两个阶段,即几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU。
概述
可以看出,GPU的渲染流水线接受顶点数据作为输入。这些顶点数据是由应用阶段加载到显存中,再由DrawCall指定的。这些数据随后被传递给顶点着色器。
几何阶段:
- 顶点着色器是完全可编程的。它通常用于实现顶点的空间变换、顶点着色等功能。
- 曲面细分着色是一个可选的着色器,用于细分图元。
- 几何着色器也是一个可选的着色器,用于执行逐图元的着色操作,或者用于产生更多的图元。
- 裁剪的目的是将不在摄像机视野内的顶点裁剪掉,并剔除某些三角形的面片。这个阶段可配置不可编程。
- 屏幕映射是不可配置不可编程的,负责把每个图元的坐标转换到屏幕坐标系中。
光栅化阶段:
- 三角形设置和三角形遍历阶段也都是固定函数阶段。
- 片元着色器是完全可编程的,它用于实现逐片元的着色操作。
- 逐片元操作负责修改颜色、深度缓冲、进行混合等,它不是可编程的,但具有高配置性。