2.3 GPU流水线
GPU流水线
说人话:几何阶段+光栅化阶
几何阶段
顶点着色器
vertex shader:完全可编程。实现顶点的空间变换,顶点着色。
曲面细分着色器
Tessellation Shader:可选着色器。用于细分图元
几何着色器
Geometry Shader:可选着色器。用于执行逐图元的着色操作,或产生更多图元。
裁剪
clipping:可配置。裁剪掉不在摄像机视野内的顶点和剔除某些面片
针对对象:部分在视野内的图元(不可编程,但可以自定一个裁剪操作)
屏幕映射
screen mapping:不可配置和编程的。用于把每个图元的坐标转换到屏幕坐标系当中。
输入:三维坐标(范围在单位正方体:即经过正交投影后的三维坐标)
需要注意OpenGL和DirectX屏幕坐标系的不同:OpenGL在左下,DirectX在左上。
顶点着色器
输入:CPU
处理单位:顶点(每个顶点调用一次顶点着色器)
限制:无法创建和销毁顶点,无法获得两个顶点的相关联系(逐顶点计算)
优点:处理速度快(不用考虑关联性,GPU狂喜)
工作:
- 坐标变换:把顶点坐标从模型空间转换到齐次裁剪空间,以及其他需求所需的顶点变换。
- 逐顶点光照
光栅化阶段
三角形设置
输入:顶点
输出:顶点所构成的边的表示方式(三角形框)
三角形遍历Triangle Traversal(扫描变化)
工作:检查每个像素是否被三角所覆盖
输出:片元(包含被覆盖的像素,以及屏幕坐标,深度信息,法线,纹理坐标等等)而不仅仅是一个像素。
片元着色器Fragment Shader(像素着色器Pixel Shader)
逐片元操作Per-Fragment Operations(输出合并阶段Output-Merger)
片元着色器
输入:对顶点信息进行插值的像素信息(对顶点着色器输出的信息插值)
输出:一个或者多个颜色值
使用包括:纹理采样。通过对顶点纹理坐标的插值,就可以或者中间信息的纹理坐标。
局限:只正对单个片元,无法将结果传输给其他片元。
逐片元操作:高度可配置性
任务:
- 决定片元的可见性
- 对通过所有测试的片元的颜色值和储存在颜色缓冲区的颜色合并
过程:
模板测试Stencil test
读取片元模板值,将该值和预定值比较,比较条件自己定义,不符合条件则舍弃。一般用来限制渲染区域。(渲染阴影,轮廓渲染)
深度测试
深度就是指离屏幕的远近。根据深度值的选取条件,就可以实现基本的遮挡,以及进阶的透明等效果。也是高度自定义的。
一般来说在unity中深度测试会放在片元着色前(Early-Z),避免着色器计算不需要的颜色。(但是在透明情况下需要关闭)
混合
关闭混合:直接覆盖颜色缓冲区的值
开启混合:可以定义混合条件,达到不同的颜色混合效果,就是PS里面的图层叠加方式(正片叠底等)
双重缓冲:保证画面连续(交替显示(避免出现渲染一半的画面))