综述
渲染流水线:由一个三维场景出发、生成一张二维图形。
渲染流程分为3个阶段:应用阶段、几何阶段、光栅化阶段。
应用阶段:
我们主导,由CPU负责实现。最重要的是输出渲染图元(渲染所需的几何信息)。并传至下一阶段
1、准备场景数据
2、做粗粒度剔除工作
3、设置好每个模型渲染状态
几何阶段:
在GPU上进行,用于处理所有和我们要绘制的几何相关的事情。一个重要任务是把顶点坐标变换到屏幕空间中,再交给光栅器处理。对渲染图元多步处理后,将输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传输给下一个阶段。
光栅化阶段:
在GPU上运行,使用上一阶段传递的数据产生屏幕上的像素,并且渲染出最终图像。任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。对上一个阶段得到的逐顶点数据进行插值,再进行像素处理。
CPU和GPU之间的通信
渲染流水线起点是CPU,应用阶段。
应用阶段大致分为三个阶段:
(1)把数据加载到显存中。
所有渲染所需数据都需要从硬盘加载到系统内存(RAM),网格和纹理等又被加载到显卡上的存储空间-显存。显卡对显存访问更快,大多数显卡对于RAM没有直接访问权利。这之后,开发者通过CPU设置渲染状态,指导GPU如何进行渲染工作。
(2)设置渲染状态。
渲染状态定义了场景中的网格是怎样被渲染的(如使用哪个顶点着色器、片元着色器、光源属性、材质等),更改渲染状态。做好后,CPU调用渲染命令Draw Call告诉GPU可以开始渲染。
(3)调用Draw Call
Draw Call是一个命令,发起方是CPU,接收方是GPU。这个命令会指向一个需要被渲染的图元列表,不会再包含任何材质信息。给定了一个Draw Call后,GPU会根据渲染状态和顶点数据进行计算,最终输出屏幕像素。计算过程就是GPU流水线。
GPU流水线
GPU渲染过程就是GPU流水线。
几何阶段和光栅化阶段开发者无法拥有绝对的控制权,其实现载体是GPU。
几何阶段和光栅化阶段可分若干更小的流水线阶段,由GPU实现。
几何阶段:
(顶点数据->)顶点着色器->曲面细分着色器->几何着色器->裁剪->屏幕映射
光栅化阶段:
(屏幕映射->)三角形设置-> 三角形遍历->片元着色器->逐片元操作(->屏幕图像)