【发布时间】:2018-09-26 11:15:16
【问题描述】:
我很难理解此处 (https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview) 官方文档中使用的术语
它说准备顶点数组数据可以是给定一个3D位置数据和UV纹理坐标的列表,以及一个索引列表,它可以生成一个顶点流。
然后需要解释此顶点流,以便 OpenGL 可以对其进行操作。例如,12 个顶点的流可以解释为 4 个独立的三角形或 10 个相关的三角形。
但在我看来,上述步骤似乎是将许多步骤组合在一起,即顶点着色和原始组装。这么多步骤真的会一起发生吗?
例如,文档在顶点着色中说,流中的顶点被转换为输出顶点。这太笼统了,似乎在准备顶点数组数据的“第一步”中已经完成了。
这是我对整个管道的初步构想:
3D 位置形式的顶点数据作为列表输入(流)提供,此外还可以输入纹理坐标列表。
这个数据流被消耗,连同一个索引列表,我们按顺序排列顶点。然后以特定方式解释有序的顶点列表(例如,每 3 个顶点 = 1 个图元或每连续 3 个顶点 = 1 个图元)。
然后将顶点发送到顶点着色器,该着色器还输入顶点列表并计算顶点法线等属性,然后将它们作为顶点输出流发送。
然后是通过镶嵌着色器计算额外基元的可选步骤,或使用几何着色器作用于镶嵌基元以创建更复杂的基元。
现在我们继续讨论 Primitive Assembly,这是一个独立于计算原语早期阶段的过程。此步骤旨在将原语分解为许多基本原语。例如。组成一个图元的 12 个顶点列表被分解为 11 个基本线图元。
然后我们继续进行剪裁过程,在此我们修改或删除不在相机视图内的所有顶点。
下一步是光栅化,我们根据光栅化器使用的基本原语流生成片段。片段比基本图元小得多,用于覆盖像素,而不是逐个像素地输出计算成本高昂(如在光线追踪中)。这会产生源自基本原语的片段输出。
我们将这个片段流发送到片段着色器,它的功能类似于顶点着色器。它使用这个片段的输入流并处理每个片段的颜色,在纹理中查找颜色(如果有)并修改像素深度值。
这之后会发生什么?我读到了per-sample processing,但它并没有解释太多。
我的理解差距:
片段如何最终“覆盖”屏幕中的像素?
在第 8 步中,我们是真的计算像素深度值还是只是计算片段深度值?
每个片段的输出如何知道它应该(相对)覆盖哪些像素?
在光栅化中,我想生成的片段是三角形。三角形是如何由基本图元组成的?
【问题讨论】:
-
我没有在您引用的文档中看到(我认为这是正确的文档参考),它说明了您所说的内容。你能提供一个更深层次的链接来传达你的前两个项目符号吗?对于您如何进一步理解问题中的第 7 条项目符号也是如此。