【问题标题】:Understanding some terminologies in OpenGL?了解 OpenGL 中的一些术语?
【发布时间】:2018-09-26 11:15:16
【问题描述】:

我很难理解此处 (https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview) 官方文档中使用的术语

  1. 它说准备顶点数组数据可以是给定一个3D位置数据和UV纹理坐标的列表,以及一个索引列表,它可以生成一个顶点流。

  2. 然后需要解释此顶点流,以便 OpenGL 可以对其进行操作。例如,12 个顶点的流可以解释为 4 个独立的三角形或 10 个相关的三角形。

但在我看来,上述步骤似乎是将许多步骤组合在一起,即顶点着色和原始组装。这么多步骤真的会一起发生吗?

例如,文档在顶点着色中说,流中的顶点被转换为输出顶点。这太笼统了,似乎在准备顶点数组数据的“第一步”中已经完成了。

这是我对整个管道的初步构想:

  1. 3D 位置形式的顶点数据作为列表输入(流)提供,此外还可以输入纹理坐标列表。

  2. 这个数据流被消耗,连同一个索引列表,我们按顺序排列顶点。然后以特定方式解释有序的顶点列表(例如,每 3 个顶点 = 1 个图元或每连续 3 个顶点 = 1 个图元)。

  3. 然后将顶点发送到顶点着色器,该着色器还输入顶点列表并计算顶点法线等属性,然后将它们作为顶点输出流发送。

  4. 然后是通过镶嵌着色器计算额外基元的可选步骤,或使用几何着色器作用于镶嵌基元以创建更复杂的基元。

  5. 现在我们继续讨论 Primitive Assembly,这是一个独立于计算原语早期阶段的过程。此步骤旨在将原语分解为许多基本原语。例如。组成一个图元的 12 个顶点列表被分解为 11 个基本线图元。

  6. 然后我们继续进行剪裁过程,在此我们修改或删除不在相机视图内的所有顶点。

  7. 下一步是光栅化,我们根据光栅化器使用的基本原语流生成片段。片段比基本图元小得多,用于覆盖像素,而不是逐个像素地输出计算成本高昂(如在光线追踪中)。这会产生源自基本原语的片段输出。

  8. 我们将这个片段流发送到片段着色器,它的功能类似于顶点着色器。它使用这个片段的输入流并处理每个片段的颜色,在纹理中查找颜色(如果有)并修改像素深度值。

这之后会发生什么?我读到了per-sample processing,但它并没有解释太多。

我的理解差距:

  1. 片段如何最终“覆盖”屏幕中的像素?

  2. 在第 8 步中,我们是真的计算像素深度值还是只是计算片段深度值?

  3. 每个片段的输出如何知道它应该(相对)覆盖哪些像素?

  4. 在光栅化中,我想生成的片段是三角形。三角形是如何由基本图元组成的?

【问题讨论】:

  • 我没有在您引用的文档中看到(我认为这是正确的文档参考),它说明了您所说的内容。你能提供一个更深层次的链接来传达你的前两个项目符号吗?对于您如何进一步理解问题中的第 7 条项目符号也是如此。

标签: opengl graphics


【解决方案1】:

您的理解有一些细微的不准确,这可能是您感到困惑的原因。让我试着纠正它们:

2.

此时(在顶点着色器之前),还没有图元。每个顶点都是自己处理的,与之后发生的事情无关。如果你有一个索引列表,这只会告诉 GPU 要处理哪些顶点数据。但即便如此,还没有原语。这些只会由原始组装步骤生成。

5.

基元组装从顶点流创建基元(取决于您的绘制调用参数和可能的着色器配置)。基本上,它正在执行您在步骤 2 中描述的操作。只有三种类型的图元(点、线、三角形)。一旦你有一个例如三角形,它永远不会像您建议的那样分解成更小或更基本的三角形。因此,原始组装没有多大作用。它只是将正确的顶点数据放在正确的图元中(例如三个后续顶点可能组成一个三角形)。

7.

片段不只是偶然覆盖像素。它们本质上是像素。更准确地说,它们表示由屏幕上给定像素表示的图元部分。并且为所有这些片段/像素调用片段着色器。在 DirectX 环境中,这个阶段称为像素着色器,它使连接更加明确。例如。一条 10 像素宽的水平线将被光栅化为 10 个片段。在这个阶段之外没有更多的三角形或其他图元。

现在回答您的问题。我相信他们中的许多人已经在上面得到了回答。

  1. 我相信这个问题已经得到解答。您可以查看一些光栅化算法来了解实现。基本思想是收集图元覆盖的所有像素。
  2. 它是片段的深度值。管道配置决定了这个值会发生什么。例如。如果您有标准深度测试,管道会将片段的深度值与当前像素的深度值进行比较,如果像素的深度值大于片段的深度值(即,如果片段位于投影到的其他所有物体的前面,则更新像素的深度值)这个像素)。
  3. 从上述说明中应该可以清楚地看到这一点。片段与像素直接对应。
  4. 也应该回答。它们不是三角形。

以上所有内容都假设了一些基本的渲染设置,以使展示更加清晰。更高级的技术(如多重采样等)可能需要对上述语句稍作调整。

【讨论】:

  • 感谢您的解释。对于第 5 点,如果一个基元比一个三角形相对复杂,例如那些在镶嵌和几何着色器中使用的那些,那么图元组装是否将它们中的每一个分解为非常离散的点和线(基本图元)?另外,对于(7),如果片段与像素相同,那么 10 个像素将被光栅化为 10 个片段是什么意思?我经常听到相反的声音(片段到像素)。
  • 5.基元永远不会比三角形更复杂。三角形是最复杂的基元。更高级的图案(例如四边形镶嵌)也可以用三角形来实现。但是这些三角形在原始组装之前就已经存在了。三角形不会分解成单独的线或点。 7. 有些人甚至可能不区分。我的意思是像素是屏幕上的实体,片段是图元的像素大小的部分(即一个像素可能有多个片段;您通常只看到最前面的一个)。
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多