渲染流水线(CPU和GPU之间的通信)
一、起点:CPU
- 把数据加载到显存当中
加载流程: 从硬盘中加载到内存,内存里的网格和纹理数据又被加载到显存。(顶点位置、法线方向、顶点颜色等等) - 设置渲染状态:定义场景中的网格是怎么被渲染的(用哪个顶点着色器、哪个片元着色器、光源属性等等)
- 调用drawcall(只是一个命令,只想一个需要被渲染的图元列表)
二、GPU流水线
1、流程
顶点数据传入 --> 几何阶段(顶点着色器 --> 曲面细分着色器 --> 几何着色器 --> 裁剪 --> 屏幕映射) --> 光栅化阶段(三角形设置 --> 三角形遍历 --> 片元着色器 --> 逐片元着色器) --> 屏幕图像
2、流程详解
- 顶点着色器
完全可编程,用于实现顶点的空间变换、顶点着色等功能。
主要工作:坐标变换和逐顶点光照。输出后续阶段所需的数据 - 曲面细分着色器
可选着色器,用于细分图元 - 几何着色器
可选着色器,用于执行逐图元的着色操作,或者用于产生更多的图元 - 裁剪
将那些不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片。这个阶段为可配置的。 - 屏幕映射
不可配置和不可编程,负责将每个图元的坐标转换到屏幕坐标系中 - 三角形设置
上一阶段输出的都是三角形网格的顶点,即我们得到的是三角网格每条边的两个端点,但是如果要得到整个三角网格对像素的覆盖情况,必须计算每条边上的像素坐标。为了能够计算边界像素坐标信息,就需要得到三角形边界的表示方式。这也一个计算三角形网格表示数据的过程就叫做三角形设置。 - 三角形遍历
- 检测每个像素是否被一个三角网格所覆盖,如果被覆盖,就会生成一个片元。
- 片元着色器
完全可编程,实现逐片元的着色操作 - 逐片元操作
不可编程,负责修改颜色、深度缓冲、进行混合等擦操作,具有很高的可配置性
3、注意事项
- 顶点着色器必须完成的工作:把顶点坐标从模型空间转换到其次裁剪空间,如下代码:
o.pos = mul(UNITY_MVP,v.position) - 屏幕坐标系在OpenGL和DirectX之间的差异问题:
1) OpenGL把屏幕的左下角当成最小的窗口坐标值
2) DirectX定义了屏幕的左上角为最小的窗口坐标值 - 三角形遍历:
检查每个像素是否被一个三角网格所覆盖,如果是,就生成一个片元。这一步将会输出一个片元序列 - 片元着色器:
1)在片元着色器前面光栅化的阶段,不会影响颜色值,而是会产生一系列的数据信息,用来表述一个三角网格是怎样覆盖每个像素的。
2)片元着色器的输入是上一个阶段对顶点信息插值得到的结果,而输出是一个或者多个颜色值。