GPU 图形渲染管线
图形渲染管线(Graphics Rendering Pipeline)是 GPU 渲染三维场景的主要工作流程。它是一个逐步处理的框架,将三维场景的数据转化为屏幕上的二维图像。
渲染管线像是一条“流水线”,输入三维几何数据(顶点、纹理等),经过一系列阶段的处理后,输出最终的像素颜色。
渲染管线的主要阶段
渲染管线通常分为以下几个阶段:
应用阶段(Application Stage)
- 发生位置:在 CPU 上。
- 作用
- 准备和提交绘制命令给 GPU。
- 加载三维模型和纹理数据,处理动画和物理计算。
- 将顶点数据、纹理数据等传递给 GPU。
- 输出
- 供后续 GPU 处理的几何数据(顶点位置、纹理坐标等)。
顶点处理阶段(Vertex Processing Stage)
- 发生位置:在 GPU 上。
- 作用
- 逐个顶点地处理输入顶点数据。
- 应用模型矩阵、视图矩阵、投影矩阵,将顶点从三维世界坐标变换到二维屏幕空间(Clip Space)。
- 传递每个顶点的附加信息(如纹理坐标、法向量)到下一阶段。
- 核心组件
- 顶点着色器(Vertex Shader):用户定义的 GPU 程序,用于控制顶点的变换和附加数据的输出。
- 输出
- 每个顶点在**裁剪空间(Clip Space)**中的位置。
** 图元组装阶段(Primitive Assembly Stage)**
- 发生位置:在 GPU 上。
- 作用
- 根据顶点数据组装几何图元(如点、线段、三角形)。
- 为每个图元准备必要的信息(如顶点位置、颜色等)。
- 图元类型
- 点(Point)。
- 线(Line)。
- 三角形(Triangle)。
** 光栅化阶段(Rasterization Stage)**
- 发生位置:在 GPU 上。
- 作用
- 将三角形图元转换为屏幕上的像素(称为片段,Fragment)。
- 剔除不可见部分(例如背面剔除、视锥裁剪)。
- 输出
- 每个片段的位置和与之相关的属性(如纹理坐标、颜色等)。
** 片段处理阶段(Fragment Processing Stage)**
- 发生位置:在 GPU 上。
- 作用
- 为每个片段计算最终的颜色值。
- 计算包括:
- 光照(基于法向量和光源位置)。
- 纹理映射(根据纹理坐标采样颜色)。
- 环境、漫反射、镜面反射等效果。
- 可自定义代码通过**片段着色器(Fragment Shader)**实现。
- 输出
- 每个像素的最终颜色。
6. 测试与混合阶段(Testing and Blending Stage)
- 发生位置:在 GPU 上。
- 作用
- 深度测试(Depth Testing):确定哪个像素在最前面,防止后面的像素覆盖前面的像素。
- 模板测试(Stencil Testing):控制像素的绘制区域。
- 混合(Blending):处理半透明效果,将新片段的颜色与帧缓冲中的已有颜色混合。
- 输出
- 最终绘制到帧缓冲区的颜色值。
渲染管线的整体流程图
CPU: 应用阶段
├──> 顶点处理(顶点着色器)
│ ├──> 图元组装
│ ├──> 光栅化
│ │ ├──> 片段处理(片段着色器)
│ │ ├──> 测试与混合
│ └──> 最终图像输出
GPU: 图形处理
固定管线 vs 可编程管线
固定管线(Fixed Pipeline)
- 传统的渲染管线,功能固定且不可修改。
- 只能完成一些基础的图形任务。
可编程管线(Programmable Pipeline)
-
现代 GPU 支持用户自定义代码(着色器)来控制每个阶段的行为。
-
可编程阶段
包括:
- 顶点着色器:控制顶点的变换和附加属性。
- 片段着色器:控制每个像素的最终颜色。
重要概念
图元(Primitive)
图元是组成几何形状的基本单位:
- 点(Point)。
- 线(Line)。
- 三角形(Triangle)。
裁剪空间(Clip Space)
在顶点着色器中,顶点最终会被变换到一个统一的坐标系统,称为裁剪空间。裁剪空间用于将三维场景投影到屏幕上。
** 片段(Fragment)**
片段是光栅化阶段产生的屏幕像素候选,它包含:
- 像素的位置。
- 与之相关的属性(颜色、深度、纹理坐标等)
帧缓冲区(Frame Buffer)
帧缓冲区是 GPU 存储最终渲染结果的内存区域,最终会显示到屏幕上。
示例:渲染一个三角形
数据准备(CPU 阶段):
// 顶点数据
const vertices = [
-0.5, -0.5, 0.0, // 左下角
0.5, -0.5, 0.0, // 右下角
0.0, 0.5, 0.0 // 上顶点
];
渲染流程(GPU 阶段):
- 顶点处理:
- 输入顶点 (−0.5,−0.5,0.0)(-0.5, -0.5, 0.0)(−0.5,−0.5,0.0)。
- 应用模型、视图、投影矩阵变换。
- 输出裁剪空间坐标。
- 图元组装:
- 将三个顶点组装成一个三角形。
- 光栅化:
- 将三角形转换为屏幕上的像素。
- 输出每个片段的纹理坐标。
- 片段处理:
- 根据光照、纹理计算每个片段的颜色。
- 混合:
- 将片段的颜色存入帧缓冲区。
- 显示:
- 发生位置:显示设备(如显示器)。
- 作用
- GPU 将帧缓冲区中的最终图像数据发送到显示设备。
- 显示器根据图像数据渲染画面。
- 输出
- 用户可以看到的最终渲染画面。
渲染流程总述
** 数据输入**
- 从 CPU 向 GPU 提供几何数据(顶点、法线、纹理等)。
- 输入的数据包括:
- 顶点位置(如 (x,y,z)(x, y, z)(x,y,z))。
- 纹理坐标(如 (u,v)(u, v)(u,v))。
- 其他属性(如颜色、法线等)。
顶点着色器
- 接收每个顶点的数据,对其进行数学变换。
- 主要输出:
- 顶点在裁剪空间中的位置。
- 相关的附加信息(如纹理坐标)。
图元组装
- 根据顶点将基本图元(如三角形)组装成可渲染的形状。
光栅化
- 将三角形分解为片段(像素的候选)。
- 输出片段的纹理坐标、颜色等信息。
** 片段着色器**
- 为每个片段计算最终颜色。
- 可能涉及:
- 光照计算。
- 纹理采样。
- 特殊效果(如法线贴图、环境遮蔽)。
测试与混合
- 深度测试、模板测试等用于确定像素是否可见。
- 处理透明效果时,进行颜色混合。
- 最终输出到帧缓冲区。
显示
- GPU 将帧缓冲区内容发送到显示设备,完成画面的显示。
图形渲染管线的数据示意图
阶段 | 输入数据 | 输出数据 |
---|---|---|
应用阶段 | 顶点、纹理、模型等 | 准备后的顶点和图元数据 |
顶点着色器 | 顶点数据(位置、纹理坐标) | 裁剪空间的顶点位置和附加数据 |
图元组装 | 顶点数据 | 几何图元(三角形、线等) |
光栅化 | 图元数据 | 屏幕上的片段 |
片段着色器 | 片段数据(位置、颜色、纹理坐标) | 每个片段的颜色 |
测试与混合 | 片段数据和深度缓冲 | 最终像素颜色 |
显示阶段 | 帧缓冲区中的图像数据 | 屏幕上的图像 |