Skip to content

图元组装 (Primitive Assembly)

图元组装是 OpenGL 渲染管线中的一个阶段,图元在此被分割为一系列独立的基本图元。经过一些次要处理后,它们被传递给光栅化器进行渲染。

早期图元组装 (Early Primitive Assembly)

图元组装步骤的目的是将顶点流转换为基本图元序列。例如,包含 12 个顶点的线列表图元需要生成 11 个线基本图元。

完整的图元组装步骤(包括下述处理)发生在顶点后处理期间。然而,某些顶点处理步骤需要将图元分解为基本图元序列。例如,几何着色器对图元序列中的每个输入基本图元进行操作。因此,必须在几何着色器执行之前进行某种形式的图元组装。

这种早期图元组装仅执行到基本图元的转换,不执行任何后续处理步骤。

如果几何着色器或曲面细分处于活动状态,则必须进行这种早期处理。曲面细分的早期组装步骤较为简化,因为补丁图元 (Patch Primitives) 始终是补丁序列。

图元顺序 (Primitive Order)

图元处理的顺序是明确定义的(在大多数情况下)。顺序定义如下:

  1. 单个顶点渲染命令中的所有图元按顺序排列在后续命令的图元之前

    • 如果绘制命令是多绘制命令 (multi-draw),则一个子绘制的所有图元按顺序排列在后续子绘制的图元之前
    • 在绘制或多绘制的子绘制中,如果绘制命令是实例渲染命令,则一个实例中的所有图元按顺序排列在具有更大 gl_InstanceID 值的图元之前
    • 在特定的绘制/子绘制/实例中,图元根据顶点流和该绘制的渲染参数排序,由渲染命令提供的图元类型解释
  2. 如果曲面细分评估着色器处于活动状态,则细分单个补丁生成的所有图元按顺序排列在具有更大 gl_PrimitiveID 值的补丁生成的图元之前

    • 由特定补丁生成的任何给定图元相对于从同一补丁生成的其他图元的顺序是未定义的
  3. 如果几何着色器处于活动状态,则从特定输入图元生成的图元按顺序排列在根据上述排序规则的后续输入图元生成的图元之前

    • 对于特定输入图元,如果几何着色器使用几何着色器实例化,则一个实例生成的所有图元按顺序排列在具有更大 gl_InvocationID 值的实例生成的图元之前
    • 在几何着色器调用内,几何着色器生成的图元按这些图元及其分量顶点的发出顺序排序

光栅化丢弃 (Rasterizer Discard)

可以通过启用 GL_RASTERIZER_DISCARD 丢弃所有图元:

cpp
glEnable(GL_RASTERIZER_DISCARD);

这会阻止任何图元被光栅化。

此功能用途:

  • 测试先前渲染阶段的性能
  • 阻止变换反馈操作期间生成的图元被渲染

警告

如果启用了光栅化丢弃,帧缓冲区清除函数将不执行任何操作。

面剔除 (Face Culling)

三角形图元的剔除在此管线阶段进行。

面剔除用于优化渲染性能,通过不渲染背对相机的三角形来实现。这对于封闭物体特别有用,因为背面的三角形无论如何都会被前面的三角形遮挡。

剔除控制

cpp
glEnable(GL_CULL_FACE);              // 启用面剔除
glCullFace(GL_BACK);                 // 剔除背面(默认)
glCullFace(GL_FRONT);                // 剔除正面
glCullFace(GL_FRONT_AND_BACK);       // 剔除正反面

正面方向

cpp
glFrontFace(GL_CCW);                 // 逆时针为正面(默认)
glFrontFace(GL_CW);                  // 顺时针为正面

三角形顶点的缠绕顺序(顺时针或逆时针)决定其是正面还是背面。

参见

基于 OpenGL Wiki 的本地化项目