一、渲染流水线
1. 概述
由一个三维场景出发,渲染一张二维的图像。
2 . 概念渲染流水线
- 应用阶段:开发者可以自由主导的阶段,通常由 CPU 负责。开发者主要通过以下 3个 主要任务
输出渲染需要的几何信息,即 渲染图元- 布置好场景。模型、相机和光照的摆放。
- 粗粒度剔除(culling)。将被遮挡,不可见的物体剔除出去。
- 设置模型的渲染状态。包括材质、纹理、shader等。
- 几何阶段: 通常在 GPU 中进行。对输入的渲染图元进行多步处理,
- 输出屏幕空间二维顶点坐标(MVP变换),每个顶点包含深度值、着色等信息
- 光栅化阶段: 通常在 GPU 上运行。主要是决定每一个渲染图元中那些像素应该绘制到屏幕上。需要对几何阶段得到的顶点数据(纹理坐标、顶点颜色)进行插值,然后逐像素处理。
下面介绍的GPU流水线这是硬件真正用于上述概念的流水线
3. CPU 和 GPU 之间通信(应用阶段)
应用阶段的起点是 CPU。主要分为三部分。
- 应用阶段
4. GPU 流水线(几何阶段 + 光栅化阶段)
GPU 接受到了 CPU 的 Draw Call 指令。会按照顺序执行下面的步骤
顶点数据
- 几何阶段
- 光栅化阶段
- 三角形设置(Triangle Setup):固定函数
- 上个阶段是三角网络的顶点,需要计算三角网络
- 三角形遍历(Triangle Traversal):固定函数
- 判断一个三角网络覆盖了哪些像素
- 并使用三角形网络的三个顶点信息对整个覆盖区域的像素进行插值
- 片元着色器(Fragment Shader):完全可编程。逐片元着色。
- 输入是上一个阶段得到的顶点信息插值得到的结果
- 包括纹理采样
- 逐片元操作(Per-Fragement Operations) / 输出合并阶段:可配置
- 决定每个片元的可见性,涉及模版测试和深度测试
读取当前片元位置的模版缓冲区的模版值(深度值),与读取的参考值(深度值)进行比较,这个比较函数的规则可以自定义 - 如果一个片元通过了所有测试,这需要将片元的颜色值和已存储在颜色缓冲区中的颜色进行合并,同时根据是否开启深度写入,决定是否更将这个片元的深度值覆盖掉原有的深度值,这和透明效果息息相关
- 如果没有通过测试,则之前的计算都白费
- 所以上述顺序有时深度测试会放在片元着色器之前
- 屏幕显示的就是颜色缓冲区的颜色值,但是为了避免看到那些正在光栅化的片元,GPU会使用双重缓冲(Double Buffering)的策略,一旦场景渲染到了后置缓冲中,GPU就会交换后置缓冲区和前置缓冲区中的内容
- 决定每个片元的可见性,涉及模版测试和深度测试
- 三角形设置(Triangle Setup):固定函数






