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

pai*_*ler 5 opengl directx graphics

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

der*_*ass 9

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

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

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

现代版本的GL规范明确提到了"早期"测试.第14.9节" OpenGL 4.5核心配置文件规范的早期片段测试" (强调我的):

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

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

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

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