什么是渲染流水线
渲染流水线的工作任务是由一个三维的场景出发、生成(渲染)一张二维图像。
此过程分为三个阶段:应用阶段、几何阶段、光栅化阶段
- 应用阶段:
(1)输出渲染图元——点、线、三角面等
(2)开发者准备好场景数据:摄像机的位置、视椎体、场景中包含的模型、使用了哪些
光源。
(3)开发者做一个粗粒度剔除工作,把不可见的物体剔除,不交给几何阶段处理
(4)设置好每个模型的渲染状态(使用的材质(漫反射颜色、高光反射颜色)、使用的纹理、使用shader) - 几何阶段:
(1)输出屏幕的顶点信息
(2)处理所有和我们要绘制的几何相关事物(决定需要绘制的图元是什么、怎么绘制它们、在哪里绘制) - 光栅化阶段:
(1)使用上一个阶段的数据来阐述屏幕上的像素,并渲染出最终图像。
CPU和GPU之间的通信
- 把数据加载到显存中
(1)从硬盘加载到内存
(2)网络和纹理等数据又被加载到显卡上的储存空间(显存) - 设置渲染状态
(1)定义场景中的网格是怎样被渲染的 - 调用Draw Call
(1)Draw Call是一个命令,发起方是CPU,接收方是GPU,仅仅指向一个需要被渲染的图元列表,不会包含任何材质信息
GPU流水线
- 概述
(1)几何阶段和光栅化阶段可以分成若干个更小的流水线阶段,这些流水线阶段由GPU来实现,每个阶段GPU提供了不同的可配置性和可编程性
(2)顶点数据——输入
(3)顶点着色器——实现顶点的空间变换、顶点着色等功能
(4)曲面细分着色器——用于细分图元
(5)几何着色器——用于执行逐图元的着色操作,或者用于生产更多图元
(6)裁剪——将不在摄像机视野内的顶点裁剪掉,或者用于产生更多图元
(7)屏幕映射——负责把每个图元的坐标转换到屏幕坐标系中
(8)三角形遍历——固定函数阶段
(9)三角形设置——固定函数阶段
(10)片元着色器——时间逐片元的着色操作
(11)逐片元操作——修改颜色、深度缓冲、进行混合
(12)屏幕图像 - 顶点着色器
(1)输入进来的每个顶点都会调用一次顶点着色器
(2)工作——坐标变换、逐顶点光照
(3)吧顶点坐标从模型空间装换到齐次裁剪空间 - 裁剪
(1)处理不在相机范围内的物体
(2)三种关系:①完全在视野内——将图元传递给下一个流水线,②部分在视野内——在视野交界处用新的顶点替代,③完全在视野外——不会传递图元 - 屏幕映射
(1)把每个图元的x和y坐标转换发哦屏幕坐标系下
(2)屏幕坐标系和z坐标一起够成了一个坐标系,叫做窗口坐标系。 - 三角形设置——计算光栅化一个三角网络所需的信息
- 三角形遍历——检查每个像素是否被一个三角网络所覆盖,是的话就生成一个片元
像素点是一个个网格,红色阴影代表生成的片元,如果网格中的部分比较小则不生成片元
7. 逐片元操作
(1)也可称为输出合并阶段
(2)决定每个片元的可见性——模板测试、深度测试
模板测试:将模板缓冲区中该片元的值和参考值进行比较,限制渲染区域
深度测试:将该片元的深度值和已经存在于深度缓冲区中的深度值进行比较
(3)混合颜色——混合——开启就会对片元颜色和缓冲区颜色进行融合,关闭就会直接覆盖
(4)双重缓冲:①交换后置后置缓冲和前置缓冲的内容,②后置缓冲进行光栅化,③前置缓冲进行显示