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