【技术美术】GPU渲染管线概述

【技术美术】GPU渲染管线概述

GPU渲染管线的名称由来

GPU渲染管线指代GPU渲染图形的工作过程及其环境。

GPU的工作方式和狭义上分时的CPU不同,GPU类似早期的批处理系统:

  1. 工作前需提前配置好输入和工作参数,运行时不可修改,直到工作结束;
  2. 因为GPU一般是为了渲染像素这样的特定任务,其工作流程固定且有多道工序。

这些特征很像工厂中的流水线,也因此便获得了“渲染管线”的名号,前缀GPU则是用于区分“引擎渲染管线”。

D3D中的GPU渲染管线

GPU渲染管线中的工作步骤

详解:【技术美术】GPU渲染管线笔记

完全可以把GPU渲染管线看成是一种工厂流水线,那该工厂的产品生产步骤由如下完成:

  1. 输入装配器阶段:准备渲染管线要用的各种数据以及管线设置的配置。
  2. 顶点着色器阶段:分析顶点数据确定几何物体在屏幕上的数学位置。
  3. 分割阶段:可选的能够自动分割几何物体的阶段。
    1. 壳着色器阶段:提供分割参数和控制点数据。
    2. 细化器阶段
    3. 域着色器阶段:根据控制点和权重产生分割后的新顶点。
  4. 几何着色器阶段:可选的能够根据几何物体点线面再生成新点线面的阶段。
  5. 光栅化阶段:根据几何物体的数学位置,确认其在屏幕上的物理像素,并插值顶点数据。
    1. 裁剪测试:剔除超出显示范围(视口)的那些肯定看不见的像素。
    2. 早期深度测试:提前进行深度测试,以减少无效的片段着色器计算。
  6. 片段着色器阶段:根据顶点数据和各种其他资源给像素进行最终上色。
  7. 输出合并阶段:对计算出的新像素数据进行后处理,并决定如何与上次计算的数据混合。
    1. Alpha测试:旧管线功能,用于根据Alpha进行剔除,目前用clip()替代,是第一个且可编程的剔除阶段。
    2. 模板测试:利用可选的模板功能进行像素剔除。
    3. 深度测试:利用像素的深度位置进行像素剔除。
    4. 混合:决定新的像素颜色如何写入到颜色附件中。

GPU渲染管线中的资源

缓冲区

缓冲区是GPU中最多的数据类型,实际上下文的纹理、附件也是一种缓冲区,他们的本质都是一个字节数组,只是其数据含义有所不同。

  • 顶点缓冲区:存放顶点的缓冲区,顶点数据由用户自行定义,甚至为空也是可以的。
  • 索引缓冲区:存储每个基元顶点对应在顶点缓冲区中位置的缓冲区,如果基元是三角形,那每三个索引,描述一个三角形。
  • 常量缓冲区:用户自定义的可选只读数据缓冲区,可以提供各种渲染时需要的统一数据,例如时间、矩阵之类。

纹理

纹理对应的就是图片,但需要使用GPU支持的格式进行存储。GPU对其实现了很多特殊功能,例如按0-1插值访问,mipmap等。

  • 1D纹理、1D纹理数组
  • 2D纹理、2D纹理数组
  • 3D纹理
  • Cube纹理

附件

每次绘制完成后用于存储最终像素信息的缓冲区。如果将其用于在屏幕上呈现,那一般分辨率与屏幕一致。本质也是纹理,因此每次绘制完后还可以将其反向作为输入。

  • 颜色附件:用于存储上次绘制的颜色信息,每次绘制新颜色时,需选择如何覆盖旧数据,例如混合或直接覆盖。
  • 深度模板附件:像素可以额外存储深度和掩码信息,用于处理遮挡时的绘制顺序问题,以及利用可选的模板功能来实现自定义效果。

渲染状态

对管线各种功能的设置,告诉GPU如何处理数据,以及提供一些可选功能,常用的设置如下:

  • 基元类型:确定要绘制的基元类型(索引缓冲区的数据结构),如点、线、三角面、四边面。
  • 混合方式:如何混合颜色附件中的旧数据和要写入的新数据。
  • 正面方向和剔除方向:绘制面时可以根据顶点的顺逆时针顺序判断其正反方向,可以决定要绘制哪个方向。
  • 深度测试、深度写入、深度偏移:如何进行深度测试,以及是否写入深度,以及对深度的偏移。
  • 模板测试和模板写入:如何进行模板测试、以及如何写入模板掩码数据。

着色器

实现对GPU中部分阶段的编程,通过代码的方式具体控制各种绘制效果的实现。

  • 顶点着色器
  • 壳着色器
  • 域着色器
  • 几何着色器
  • 片段着色器
posted @ 2025-12-23 21:15  BDFFZI  阅读(0)  评论(0)    收藏  举报