在一个项目中,我希望选择使用屏幕对齐多边形的可视对象,以及“选择”对于该多边形的各种条件,我基本上是将多边形绘制到模板缓冲区中,然后使用模板测试和遮挡查询来测量对象和选择多边形在屏幕空间中的重叠程度。
这个效果很好。但是,想象一下,当我被这样的说法所绊倒时,我的惊讶之处是,根据OpenGL Wiki的遮挡查询实际上并不关心模具测试:
他们检测范围内的绘图命令是否通过深度测试,如果是的话,这些三角形中有多少样本通过了深度测试。请注意,样本计数和通过/失败仅基于深度测试。模板测试,或片段着色丢弃与查询无关,尽管它们在技术上是在片段着色之后发生的。
这显然与我的实际经验相矛盾,使我有点担心/困惑。我看了一下规范(最新的4.6内核和优秀的旧2.0,我们实际上是为了兼容性而在我们的项目中使用它),它还说遮挡查询包括通过深度测试的样本数量。然而,它并没有像wiki那样对模具测试做明确的陈述。由于深度测试在技术上是在模具测试之后进行的,我不完全确定这是否已经包括了模板测试,而且规范的措辞只是为了方便使用最后一阶段。
所以,我的问题是,遮挡查询是否尊重模具测试(或者其他任何早期的片段测试,我实际上是在使用剪刀测试和另一个无关算法中的遮挡查询)?我在这里看到了一些可能性:
(在实践中,我肯定可以将我的算法重组为使用深度测试,但这是一个让我对理论含义和基础感到好奇的问题。)
发布于 2017-10-02 15:34:51
与Wiki文章一样,规范已经在这一点上被澄清了也是如此。所以让我们解释一下。
规范中的新措辞是:
在深度测试之后,仍在处理的每个片段的样本传递计数将增加。
这是一个更好的措辞,因为它清楚地表明,事情的处理顺序是重要的。OpenGL 将深度测试定义为模具测试、剪刀测试等之后发生的深度测试。.因此,这一措辞清楚地表明,深度测试和它面前的一切都很重要。
所以它尊重模具测试。以及片段着色器discard,因为FS是在所有这些测试之前指定的。
除非你是强制这些测试发生在片段着色器之前。如果这样做,那么对FS中的片段进行discard将不会阻止阻塞查询对该片段进行计数。因此,如果实施早期测试,就会失去使用discard影响遮挡查询计数的权利。
https://computergraphics.stackexchange.com/questions/5672
复制相似问题