图形1.1 渲染流水线
渲染流水线
渲染阶段
-
应用阶段(Application Stage):应用阶段由cpu负责。决定传递给gpu的数据
-
几何阶段(Geometry Stage): 上个阶段传递过来的图元进行逐顶点、逐多边形的操作。把顶点坐标转换到屏幕空间,并决定传给光栅器处理的数据
-
光栅化阶段(Rasterizer Stage):光栅化阶段由gpu负责。决定哪些像素应该被绘制在屏幕上并计算对应像素的颜色。
CPU与GPU的通信
cpu在与gpu的通信中,需要把数据加载到显存,设置好渲染状态,然后调用DrawCall。
加载数据:这些数据包括网格纹理、顶点颜色法线纹理等。
渲染状态:决定使用哪个着色器、光源属性、材质来渲染,所有的网格使用一种渲染状态。
DrawCall:一个发起绘制命令的函数,由cpu发出。它指向一个即将被渲染的图元列表,通知gpu按照设置进行图元渲染。
——不要频繁的调用DrawCall。在实际的渲染中,GPU的渲染速度往往超过了CPU提交命令的速度,这导致渲染中大部分时间都消耗在了CPU提交Draw Call上。我们需要尽可能用多准备数据给cpu而更少的调用DrawCall,从而通知gpu快速渲染。
渲染流水线概述
- 应用阶段
- 粗粒度剔除
- 进行渲染设置
- 准备基本数据
- 输出到几何阶段
- 几何阶段
- 顶点着色器
- 曲面细分
- 几何着色器
- 顶点裁剪
- 屏幕映射
- 光栅化阶段
- 三角形(点/线)设置
- 三角形(点/线)遍历
- 片元着色器
- 逐片元操作
- 裁剪测试
- 透明度测试
- 深度测试
- 模板测试
- 混合
应用阶段
- 加速算法 粗粒度剔除
- 碰撞检测
- 加速算法
- 遮挡剔除:八叉树、BSP树、K-D树、BVH
- 其他算法
- 设置渲染状态 准备渲染参数
- 绘制设置:使用着色器、合批方式
- 绘制顺序:相对相机距离、材质渲染队列、UICanvas、其他方式
- 渲染目标:FrameBuffer、RenderTexture
- 渲染模式:前向渲染、延迟渲染
- 调用DrawCall 输出渲染图元到显存
- 顶点数据:位置、颜色、纹理、发现、纹理uv坐标、其他
- 其他数据:MVP变换矩阵、纹理贴图、其他
几何阶段
- 可选顶点处理 [可以完全编程控制]
- 曲面细分(可选):在原有的图元内加入更多的顶点
- 几何着色器(可选):可控制GPU对顶点进行增删改操作,并行程度低
- 投影 [无法控制 已由GPU固定实现]
- 正交
- 透视
- 裁剪 [无法完全控制]
- CVV:(Canonical View Volume)
- 正面或背面剔除(可配置)
- 屏幕映射 [无法控制 已由GPU固定实现]
- 从连续到离散
- 坐标系差异
光栅化阶段
- 三角形遍历:检验屏幕上的某个像素是否被一个三角形网格覆盖,被覆盖的区域将生成一个片元。这些片元用于计算每个像素的最终颜色,并对其深度进行插值计算,对于后面计算遮挡、半透明等效果有着重要作用。
- 片元着色器:为每个片元计算颜色,该阶段完全可编程,计算结果不与附近片元相影响。
逐片元操作
- 透明度测试:仅绘制透明度值达到设置的阈值时的片元。在OpenGL3.1被删除,与clip()效果相差不大
- 模板测试:将目标片元的模板值与缓冲区片元的模板值进行可配置的比较,仅绘制通过比较的片元。
- 深度测试:将目标片元的深度值与缓冲区片元的深度值进行可配置的比较,仅绘制通过比较的片元。[大量的被遮挡片元浪费了计算量,在不与透明度测试冲突的情况可用Early-Z(早于片元着色器计算前进行舍弃)进行优化]
- 混合:通过可配置的规则进行颜色的替换或者根据不透明度混合
后处理
对输出的缓冲区/渲染贴图进行处理,如:Bloom,景深,FXAA,边缘检测。
参考
- GAMES101-现代计算机图形学入门-闫令琪-Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)
- 【技术美术百人计划】图形 1.1 渲染流水线-TA100-renderpipeline-v2.1