首先,我不完全确定裁剪是如何工作的,但我认为裁剪"削减"虽然我不知道这在实践中是如何运作的,但观众看不到的碎片。但是,它是在原始汇编之前还是之后发生的?
基元组装步骤的目的是将顶点流转换为基本基元序列。例如,一个原语 这是12个顶点的行列表需要生成11行基数 原语。
完整的原始组装步骤(包括下面的处理)将会 始终在Vertex Post-Processing之后发生。但是,有些顶点 处理步骤要求将原语分解为a 基本原语序列。例如,几何着色器操作 在原语序列中的每个输入基本原语上。因此,一个 原始装配的形式必须在GS执行之前发生。
这个早期的原始程序集只执行到base的转换 原语。它不执行以下任何处理步骤。
如果使用几何着色器或曲面细分,则必须进行此类早期处理 活跃。曲面细分的早期装配步骤已简化, 因为Patch Primitives总是补丁序列。
似乎有两种形式的原始组装,我很困惑。
首先,我们看到当顶点数据首次被送入顶点着色器进行渲染时,它必须将顶点流解释为一些三角形或直线等。这称为"渲染"我想。
但另一方面,上面引用的原始程序集也做了类似的事情。这两个过程有什么区别?
关于primitives的文章说:
OpenGL中的术语Primitive用于表示两个相似的但是 单独的概念。第一个是OpenGL使用的解释方案 确定渲染时顶点流表示的内容。 这样的顶点序列可以任意长。
" Primitive"的其他含义是因为 顶点流的解释,作为原始集合的一部分。 因此,通过这些原语之一处理顶点流 解释导致有序的基元序列。该 个别原语有时被称为"基本原语"。
如果我们按照上面的引用,似乎两个明显不同的概念之间没有区别。 "解释步骤"例如,可以将10个顶点的序列视为8个相关三角形。但原始装配步骤也是如此,它可以查看依赖的三角形"作为基本原语。两者之间有什么具体的不同?
答案 0 :(得分:3)
基本上,有很多东西被称为"原始汇编"。它们都做同样的事情(将一系列顶点转换成单独的基元),但其中一些发生在不同的时间。
该规范的一个特定章节标题为"固定功能原始组装和光栅化。"有人可能会说,这就是""原始组装阶段发生。但是标准还说它发生在VS之后,TES之后和GS之后(如果适用)。
该标准仍然涉及"原始组装阶段"好像只有一个,尽管它显然需要多个。
清楚的是,裁剪过程知道了各个原语,所以在到达那个阶段之前就已经发生了一些原始的装配。
答案 1 :(得分:0)
我在OpenGL版本4.6规范(核心配置文件)中找到了一些东西:
顶点着色器的输出:
如果将输出变量直接传递到导致栅格化的顶点处理阶段,则所有输出的值都应在正在渲染的图元上进行插值,除非使用阴影着色。否则,一旦为一个原语收集了足够的数据,所有输出的值将由原语组装阶段收集,并传递到下一个管道阶段。
似乎没有TES和GS,则稍后将进行“原始组装”。否则,将是官方文档中所述的“早期原始程序集”。
但是在规范的“ 11.1.3着色器执行”中:
执行以下操作序列:
- 顶点由顶点着色器处理(请参见11.1节),并按照10.1至10.3节中的说明组装成图元。
- 如果当前程序包含镶嵌控制着色器,则每个单独的修补程序原语将由镶嵌控制着色器处理(11.2.1节)。否则,基元将未经修改地传递。如果处于活动状态,则镶嵌控制着色器将使用其输入补丁,并生成一个新的补丁原语,该原语将传递到后续的管道阶段。
- 如果当前程序包含镶嵌细分评估着色器,则每个单独的补丁原语将由镶嵌细分基础生成器(第11.2.2节)和镶嵌细分评估着色器(请参见第11.2.3节)进行处理。否则,原语将未经修改地传递。当细分评估着色器处于活动状态时,细分图元生成器将生成新的点,线或三角形图元集合,以将其传递到后续管线阶段。这些图元的顶点由销售评估着色器处理。传递给镶嵌图元生成器的补丁图元将被此过程消耗。
- 如果当前程序包含一个几何着色器,则每个单独的图元都由几何着色器处理(11.3节)。否则,基元将未经修改地传递。如果启用,则几何着色器将使用其输入面片图元。但是,每次几何着色器调用都可能会发出新的顶点,这些顶点被排列成图元并传递到后续的管道阶段。
在执行着色器之后,将应用第13章中描述的固定功能操作。
查看第13章中的“固定功能操作”,将执行所有“顶点后处理”,例如剪切,透视图划分,视口变换和变换反馈。在第13章中,我发现:
在可编程顶点处理之后,以下固定功能运算将应用于所得图元的顶点:...
我认为“原始集会”的准确时间可能很难说,但是我倾向于认为这是在顶点处理之后完成的。正如Nicol所说,很明显,剪辑的过程了解各个原始图元,因此某些原始图元在到达该阶段之前就已经发生了。。
我认为在顶点处理和栅格化之间的所谓“原始装配”阶段的主要任务之一是人脸剔除。 (我不熟悉多图,也许这个阶段也与此有关。)
# Start
(Vertices Data)
|
|
|
V
Vertex Shader # Do primitive assembly here
|
|
| (primitives)
|
V
[Tessellation Shaders]
|
|
| (primitives)
|
V
[Geometry Shader]
|
|
| (primitives)
|
V
Vertex Post-processing
|
|
| (primitives)
|
V
Primitive Assembly # Mainly do face culling
|
|
| (primitives)
|
V
Rasterization
|
|
| (fragment)
|
V
Fragment Shader
# [] means can be ignored