1.先整体了解一下什么是渲染流水线1.1该从哪里下手所以什么是渲染流水线我们不妨将这个问题拆成两个问题既什么是渲染什么是流水线。1.2什么是渲染渲染是一种工作流程通过一系列图形阶段把三维场景中的几何、材质、光照和相机信息最终计算成屏幕上每个像素的颜色生成一帧二维图像。1.3什么是流水线流水线则是一种工作方式引入流水线后不同步骤可以同时处理不同任务从而提高整体吞吐量。我们以制造一批娃娃来举例子通过分析不使用流水线和使用流水线的情况下生产娃娃看看他们的效率之间的差距这样或许你就知道为什么渲染要引入流水线技术毕竟GPU是以高性能著称。如下图1所示你会发现从开始到结束使用流水线的生产线总共制造了4个娃娃而没有使用流水线的生产线总共才制造了2个娃娃引入流水线后虽然制作一个洋娃娃仍然需要4个步骤但不需要从头到尾完成全部步骤 而是每个步骤由专人来完成所有步骤并行进行。如果你是生产线老板你会引入流水线技术吗答案是肯定的所以你现在知道为什么渲染要引入流水线技术了吗图11.4回答什么是渲染流水线1.4.1简要回答我们知道了渲染是一种工作流程而流水线是一种工作方式所以渲染流水线是一种并行工作方式与渲染工作流程的结合。1.4.2严谨表述当然以上表述可能过于简化如果你更追求严谨更严谨的表述:渲染流水线是将渲染任务划分为多个有序阶段并采用流水线方式让不同阶段同时或重叠处理不同数据从而提高渲染吞吐量的处理流程。2.渲染流水线三大阶段有哪些2.1该从哪里下手上面回答了什么是渲染流水线但只是从整体角度来讲解当然这是不够的我们接下来就要知道其内部如何也就是渲染流水线有哪些阶段以及每个阶段都在做什么。渲染流程通常分成三个阶段:应用阶段几何阶段光栅化阶段如图2所示。注意这里仅仅是概念性阶段每个阶段本身通常也是一个流水线系统即包含了子流水线阶段。本书的重点是几何阶段和光栅化阶段所以重点讲解这两个阶段的子流水线阶段如图3所示展示了这两个阶段的各个子流水线阶段。综上接下来讲解的逻辑是理解应用阶段大体都在做什么然后重头戏是理解几何阶段和光栅化阶段的各个子流水线阶段都在做什么。图2图32.2应用阶段应用阶段主要有三个阶段:把数据加载到显存→设置渲染状态→调用DrawCall。2.2.1把数据加载到显存中先搞清楚这里的数据指的是什么我们知道,模型由一个个点线面构成如图4所示。而这里的数据通常是模型的一些顶点信息例如顶点的位置信息、法线方向、顶点颜色、纹理坐标等。为了提高渲染性能往往需要做一个粗粒度剔除culling工作以把那些不可见的物体剔除出去这样就不需要再移交给几何阶段进行处理。也就是说完全在视锥外整体剔除但是与视锥相交则整个物体先提交后续由几何阶段的裁剪工作来处理。图4把数据加载到显存的流程我们游戏中的模型等数据往往一开始是存在系统硬盘中当我们场景中需要哪些数据的时候就会将这些数据从硬盘读取到系统内存RAM中然后再交给GPU的显存中大致流程如图5所示。图5为什么要加载到显存专业的事要交给专业的人我们知道GPU是以高性能著称所以场景中所有需要渲染的数据当然要交给GPU来处理所以应用阶段第一件事情就是把数据加载到显存中。2.2.2设置渲染状态首先理解一下状态这个词!状态就是当前生效的一套配置。每个状态项只能有一个值但多个状态项能同时生效。人当前只能跑、走或跳但能同时拿武器、穿装备、开 Buff。GPU 也是不能同时用两个片元着色器也不能既开又关混合但能同时用某 Shader、绑纹理、开深度、关混合。设置渲染状态就是改这些状态项告诉 GPU 接下来怎么画。为什么要设置渲染状态把数据加载到显存后这些数据只是一些模型的顶点信息如果不设置渲染状态那么大家所展示出来的模型都是一个样那有什么意义呢?所以这个时候你就要指定这个模型应该呈现一种什么状态给我们也就是指定材质顶点着色器/片元着色器、光源属性、材质等这就是设置渲染状态。注意如果我们没有更改渲染状态那么所有的网格都将使用同一种渲染状态如图6所示。图6为什么在把数据加载到显存的时候不直接把材质等数据加载到显存其实也可以但大部分不这样做原因是如果把模型加载和材质状态绑定死就会失去复用性、灵活性和性能优化空间。实际引擎通常把“资源加载”和“状态设置”分开绘制时再组合成一次具体的渲染。2.2.3调用DrawCall当上述工作都做完了之后CPU会调用DrawCall函数以命令GPU渲染哪个模型如图7所示。该函数会指向刚刚加载到显存的数据而不会再包含任何材质信息 ,因为在调用DrawCall之前,已经设置了渲染状态指定了这个模型要使用的材质可以参考如下伪代码。伪代码:设置 A 状态 Draw(A) 设置 B 状态 Draw(B)图72.2.4输出从字面意思来看应用阶段是由我们应用主导的因此由CPU负责实现。应用阶段是渲染管线的起点由 CPU 执行所以它没有“上一管线阶段”的输出作为输入。该阶段会输出好要渲染的数据而这一阶段最重要的输出是渲染所需的几何信息,既渲染图元。渲染图元可以是点线面。3.下篇讲解几何阶段与光栅化阶段的各个子流水线阶段...