在 OpenGL 的“原始组装”阶段会发生啥

Posted

技术标签:

【中文标题】在 OpenGL 的“原始组装”阶段会发生啥【英文标题】:What happens at the "Primitive assembly" stage in OpenGL在 OpenGL 的“原始组装”阶段会发生什么 【发布时间】:2020-05-19 19:34:38 【问题描述】:

在阅读有关原始装配的图形管道时,我有点困惑。在文档中说,

基元组装是收集从先前阶段输出的一系列顶点数据并将其组合成一系列基元的过程。用户渲染的基元类型决定了这个过程的工作方式。 此过程的输出是简单基元(线、点或三角形)的有序序列。例如,如果输入是包含 12 个顶点的三角形条带图元,则此过程的输出将是 10 个三角形。

它说顶点数据处理成图元序列,但同时镶嵌阶段操作图元,几何阶段操作图元(从输入图元可以生成零个或多个图元)。我的问题是:为什么原始组装不在几何着色器阶段的 Tesselation 前面?

【问题讨论】:

【参考方案1】:

有不同类型的图元,每个阶段可以将不同类型的图元作为输入,产生不同类型的图元作为输出。

镶嵌评估着色器将 补丁 作为输入。因此,您不能将正常的图元组装放在细分评估着色器之前,因为图元组装会产生点、线或三角形。

几何着色器将点、线、三角形、相邻的线或相邻的三角形作为输入。因此,您不能将普通的图元装配放在几何着色器之前,否则您将无法使用具有邻接数据的直线或三角形。

这样想:主要的图元组装阶段只是将一个图元流转换为可以转换为片段的图元流。因此,这是在管道中的所有内容都转换为片段之前发生的最后一件事。

请注意,有限形式的原始组装确实发生在几何和细分评估着色器之前。来自Rendering Pipeline Overview:

如果曲面细分或几何着色器处于活动状态,则在这些顶点处理阶段之前执行有限形式的图元组装。这用于为那些特定的着色器阶段提供单个图元,而不是一系列顶点。

【讨论】:

【参考方案2】:

原因是曲面细分和几何着色器阶段的结果可以生成额外的顶点数据(您最终会得到更多的几何图形)。在此之后,图元组装阶段可以组装所有顶点数据,包括从曲面细分和几何着色器生成的顶点数据到图元中,然后进行光栅化。

【讨论】:

好的,但是曲面细分和几何着色器如何操作图元?在这些阶段之前,还执行原始组装?

以上是关于在 OpenGL 的“原始组装”阶段会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

在设备方向下 iPhone 上的 OpenGL ES 原点会发生啥

原始装配性能

OpenGL:如果我将新的纹理绑定到另一个目标,纹理会发生啥?

如果 glutPostRedisplay() 被调用太快会发生啥?

当一个线程试图访问一个互斥锁资源时会发生啥?

当我们重新启动 Azure Databricks 群集时,内部会发生啥?