为什么在片段操作后面进行剪刀测试?

时间:2015-11-19 15:28:47

标签: opengl graphics directx

如果我理解正确,剪刀测试是每个片段操作,但我想知道是否可以在片段着色器之前进行测试,以便剪刀盒外的片段不需要加阴影,甚至在光栅化器之前? 不这样做的唯一原因我能想到的是剪出清晰的颜色。

1 个答案:

答案 0 :(得分:7)

剪刀测试几乎可以在任何真实场景中影响光栅化本身。 GPU的光栅化器单元不会在剪刀矩形之外产生碎片。首次创建OpenGL管道时,片段着色器不存在。在GL规范的早期版本中,像纹理映射这样的东西被认为是光栅化阶段的一部分。

但是,这个概念性管道并不是实际的HW实现的。只要最终结果不会因偏差实施而改变,这就没有问题。

您通常会看到,除了剪刀测试之外,还会在调用片段着色器之前执行深度测试(“早期Z”)。只要片段着色器不修改片段的深度值,这将起作用。通常,只要片段着色器中没有gl_FragDepth的赋值,实现就会自动启用后面的Z.

GL规范的现代版本明确提到了“早期”测试。第14.9节OpenGL 4.5 core profile specification州的“早期片段测试”(强调我的):

  

一旦通过光栅化产生片段,就会产生许多片段   可以在片段着色器执行之前执行操作(请参阅   第15节)。如果在任何这些片段中丢弃片段   操作,任何后续阶段都不会处理,   包括片段着色器执行。最多五个操作   按以下顺序对每个片段执行:

     
      
  • 像素所有权测试(参见第17.3.1节);
  •   
  • 剪刀试验(见第17.3.2节);
  •   
  • 模板测试(参见第17.3.5节);
  •   
  • 深度缓冲测试(见第17.3.6节);和
  •   
  • 遮挡查询样本计数(参见第17.3.7节)。
  •   
     

始终执行像素所有权和剪刀测试。当且仅当启用了早期片段测试时才执行其他操作   在活动片段着色器中(参见15.2节)。 [...]

实际上,即使同一文档中的管道图仍然在片段着色器之后列出它,“晚期”剪刀测试也不再存在于GL中。