openGL管道中的剪切是否发生在原始汇编之前或之后?

时间:2018-04-16 15:24:47

标签: opengl graphics

首先,我不完全确定裁剪是如何工作的,但我认为裁剪"削减"虽然我不知道这在实践中是如何运作的,但观众看不到的碎片。但是,它是在原始汇编之前还是之后发生的?

official documentation说:

  

基元组装步骤的目的是将顶点流转换为基本基元序列。例如,一个原语   这是12个顶点的行列表需要生成11行基数   原语。

     

完整的原始组装步骤(包括下面的处理)将会   始终在Vertex Post-Processing之后发生。但是,有些顶点   处理步骤要求将原语分解为a   基本原语序列。例如,几何着色器操作   在原语序列中的每个输入基本原语上。因此,一个   原始装配的形式必须在GS执行之前发生。

     

这个早期的原始程序集只执行到base的转换   原语。它不执行以下任何处理步骤。

     

如果使用几何着色器或曲面细分,则必须进行此类早期处理   活跃。曲面细分的早期装配步骤已简化,   因为Patch Primitives总是补丁序列。

似乎有两种形式的原始组装,我很困惑。

首先,我们看到当顶点数据首次被送入顶点着色器进行渲染时,它必须将顶点流解释为一些三角形或直线等。这称为"渲染"我想。

但另一方面,上面引用的原始程序集也做了类似的事情。这两个过程有什么区别?

关于primitives的文章说:

  

OpenGL中的术语Primitive用于表示两个相似的但是   单独的概念。第一个是OpenGL使用的解释方案   确定渲染时顶点流表示的内容。   这样的顶点序列可以任意长。

     

" Primitive"的其他含义是因为   顶点流的解释,作为原始集合的一部分。   因此,通过这些原语之一处理顶点流   解释导致有序的基元序列。该   个别原语有时被称为"基本原语"。

如果我们按照上面的引用,似乎两个明显不同的概念之间没有区别。 "解释步骤"例如,可以将10个顶点的序列视为8个相关三角形。但原始装配步骤也是如此,它可以查看依赖的三角形"作为基本原语。两者之间有什么具体的不同?

2 个答案:

答案 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所说,很明显,剪辑的过程了解各个原始图元,因此某些原始图元在到达该阶段之前就已经发生了。

我认为在顶点处理和栅格化之间的所谓“原始装配”阶段的主要任务之一是人脸剔除。 (我不熟悉多图,也许这个阶段也与此有关。)


顶点过程图:

vertex


基于我的简单理解的简单管道:

# 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