1.结构
Application | ||
Geometry Processing | Vertex Shading | Vertex Shader |
Tessellation | ||
Geometry Shader | ||
Projection | ||
Clipping | ||
Screen Mapping | ||
Rasterization | Triangle Setup | |
Triangle Traversal | ||
Pixel Processing | Pixel Shading | |
Merging |
2.应用阶段(Application)
向几何阶段提交需要渲染的图元
3.几何阶段(Geometry Processing)
负责执行逐顶点/逐三角形操作
几何阶段可以进一步细分为四个子阶段:
- 顶点着色
- 投影
- 裁剪
- 屏幕映射
3.1 顶点着色(Vertex Shading)
主要负责顶点数据的预处理,包括顶点和法线的坐标转换
为了方便裁剪,需要在顶点着色器中将顶点从模型空间(Model Space)转换到齐次裁剪空间(Canonical View Volume)
GPU计算能力不足时,也可以直接在顶点着色器执行着色计算
现代游戏一般在片元着色器进行着色计算,顶点着色器只负责数据的预处理。
3.1.1 曲面细分(Tessellation)
动态地向顶点着色器的输出流中插入新顶点,提升模型细节
曲面细分着色器分为三个子阶段
- Hull Shader
- Tessellator
- Domain Shader
3.1.2 几何着色器(Geometry Shader)
获取各种类型的图元输入,并且可以生成新顶点
3.1.3 顶点流输出(Stream Output)
将顶点流输出到显存以供GPU或CPU使用
3.2 投影(Projection)
常见的两种投影方式
- 正交投影
- 透视投影
3.3 裁剪(Clipping)
处理位于视锥体边界的图元,在图元与视锥体相交处产生新顶点代替视锥体外的顶点
3.4 屏幕映射(Screen Mapping)
把裁剪空间的三维坐标映射到屏幕空间的二维坐标
4.光栅化阶段(Rasterization)
找到所有位于图元内的像素,从顶点流插值得到每个像素对应的片元信息,再传入片元着色器
这一阶段由三角形设置、三角形遍历两个子阶段共同完成
4.1 三角形设置(Triangle Setup)
计算三角形边界信息
4.2 三角形遍历(Triangle Traversal)
遍历三角形内的所有像素并计算每个像素的片元信息
5.逐像素处理(Pixel Processing)
逐个处理图元内的像素,分为像素着色和混合两个阶段
5.1 像素着色(Pixel Shading)
执行逐像素着色计算,本阶段完全可编程,通过编写像素着色器可以定义具体的着色逻辑
输入:插值得到的片元数据
输出:用于混合的一个或多个颜色
像素着色阶段的主要任务:
- 纹理采样
- 光照计算
5.2 混合(Merging)
每个像素的颜色信息储存在颜色缓存(Color Buffer)中,深度信息储存在深度缓存(Z-Buffer/Depth Buffer)中
混合阶段的主要任务
- 混合像素着色器输出的颜色和颜色缓存中的颜色
- 根据深度判断像素可见性(丢弃较远的像素,只保留最近的像素)
本阶段不可编程,但可以配置颜色的混合逻辑