在一个项目中,我想使用与屏幕对齐的多边形以及“选择”相对于该多边形的各种条件来选择可见对象,我基本上是将多边形绘制到模具缓冲区中,然后使用模板测试,并使用遮挡查询来测量对象和选择多边形在屏幕空间中的重叠程度。

这很好用。但是,当对OpenGL Wiki所述的遮挡查询实际上并不关心模板测试的语句进行绊脚石时,可以想像我的惊讶:


它们检测作用域绘图命令是否通过深度测试,如果是,则这些三角形中有多少个样本通过了深度测试。请注意,样本计数和通过/失败仅基于深度测试。模板测试或片段着色器丢弃与查询无关,即使它们在技术上是在片段着色器之后发生的...


这显然与我的实践经验相抵触,使我有些担心/困惑。我看了一下规范(最新的4.6内核和旧的2.0内核,我们实际上都是在我们的项目中针对它们的兼容性),它还说遮挡查询是对通过深度测试的样本数量进行计数。但是,它没有做出与模板测试有关的Wiki这样的明确声明。而且由于深度测试从技术上讲是在模板测试之后进行的,因此我不确定是否已经包括模板测试,并且规范的措辞只是为了方便而使用了最后一个阶段。

因此,我的问题是,遮挡查询是否尊重模板测试(或任何其他较早的每片段测试,我实际上是在另一种不相关的算法中将剪刀测试与遮挡查询一起使用)?我在这里看到一些可能性:


他们确实尊重所有测试,出于方便的原因,规范中的措词仅使用最后一个测试。这意味着在早期测试中失败并因此甚至未到达深度测试的片段在技术上都将视为失败。不过,我不确定这在规范的措辞中是否太清楚了,但是也许我错过了一些东西,并且精通于规范编排的复杂性的人们可以对此有所了解。这也意味着上面的Wiki文章有点误导(或者我只是误读了)。
他们绝对不尊重模板测试,而实际上只关心深度测试。这意味着未通过模板测试的片段将仍必须进行深度测试。这也意味着我在特定硬件(nVidia GeForce GTX 1xxx)上的体验显然是一个错误。
或者这可能不是API中明确规定的一部分,并且为解释留下了空间。不过,这可能很奇怪,因为这不是我想使用的特别少用的功能。

(在实践中,我绝对可以重新构造我的算法以使用深度测试,但这是一个使我对理论含义和基础感到好奇的问题。)

#1 楼

关于这一点的规范已得到澄清,维基文章也是如此。因此,让我们对此进行解释。

规范中的新措辞如下:


深度测试后仍在处理的每个片段的通过样本数都会增加


这是更好的措辞,因为它清楚地说明了事物的处理顺序很重要。 OpenGL将深度测试定义为在模板测试,剪刀式测试等之后进行。因此,该措辞清楚地表明深度测试及其之前的所有内容都很重要。

因此,它确实尊重模板测试。还有片段着色器discard,因为FS被指定为在所有这些测试之前进行。

好,除非您强制这些测试在片段着色器之前进行。如果这样做,则在FS中对片段进行discard不会阻止遮挡查询对该片段进行计数。因此,如果执行早期测试,您将失去使用discard来影响遮挡查询计数的权利。