GPU流水线

说人话:几何阶段+光栅化阶

image-20230401140240022

几何阶段

  1. 顶点着色器

    vertex shader:完全可编程。实现顶点的空间变换,顶点着色。

  2. 曲面细分着色器

    Tessellation Shader:可选着色器。用于细分图元

  3. 几何着色器

    Geometry Shader:可选着色器。用于执行逐图元的着色操作,或产生更多图元。

  4. 裁剪

    clipping:可配置。裁剪掉不在摄像机视野内的顶点和剔除某些面片

    针对对象:部分在视野内的图元(不可编程,但可以自定一个裁剪操作)

  5. 屏幕映射

    screen mapping:不可配置和编程的。用于把每个图元的坐标转换到屏幕坐标系当中。

    输入:三维坐标(范围在单位正方体:即经过正交投影后的三维坐标)

    需要注意OpenGL和DirectX屏幕坐标系的不同:OpenGL在左下,DirectX在左上。

顶点着色器

输入:CPU

处理单位:顶点(每个顶点调用一次顶点着色器)

限制:无法创建和销毁顶点,无法获得两个顶点的相关联系(逐顶点计算)

优点:处理速度快(不用考虑关联性,GPU狂喜)

工作:

  • 坐标变换:把顶点坐标从模型空间转换到齐次裁剪空间,以及其他需求所需的顶点变换。
  • 逐顶点光照

光栅化阶段

  1. 三角形设置

    输入:顶点

    输出:顶点所构成的边的表示方式(三角形框)

  2. 三角形遍历Triangle Traversal(扫描变化)

    工作:检查每个像素是否被三角所覆盖

    输出:片元(包含被覆盖的像素,以及屏幕坐标,深度信息,法线,纹理坐标等等)而不仅仅是一个像素。

  3. 片元着色器Fragment Shader(像素着色器Pixel Shader)

  4. 逐片元操作Per-Fragment Operations(输出合并阶段Output-Merger)

片元着色器

输入:对顶点信息进行插值的像素信息(对顶点着色器输出的信息插值)

输出:一个或者多个颜色值

使用包括:纹理采样。通过对顶点纹理坐标的插值,就可以或者中间信息的纹理坐标。

局限:只正对单个片元,无法将结果传输给其他片元。

逐片元操作:高度可配置性

任务:

  • 决定片元的可见性
  • 对通过所有测试的片元的颜色值和储存在颜色缓冲区的颜色合并

过程:

  1. 模板测试Stencil test

    读取片元模板值,将该值和预定值比较,比较条件自己定义,不符合条件则舍弃。一般用来限制渲染区域。(渲染阴影,轮廓渲染)

  2. 深度测试

    深度就是指离屏幕的远近。根据深度值的选取条件,就可以实现基本的遮挡,以及进阶的透明等效果。也是高度自定义的。

    一般来说在unity中深度测试会放在片元着色前(Early-Z),避免着色器计算不需要的颜色。(但是在透明情况下需要关闭)

  3. 混合

    关闭混合:直接覆盖颜色缓冲区的值

    开启混合:可以定义混合条件,达到不同的颜色混合效果,就是PS里面的图层叠加方式(正片叠底等)

  4. 双重缓冲:保证画面连续(交替显示(避免出现渲染一半的画面))