【问题标题】:does logarithmic depth buffer method properly interpolate vertex attribute?对数深度缓冲区方法是否正确插入顶点属性?
【发布时间】:2020-01-06 04:29:29
【问题描述】:

我读到了对数深度缓冲区。它是否正确插入顶点属性? 我以为渲染管道会这样下去。

顶点着色器->除以w->视口变换->插值->片段着色器

(Zclip)  ---------------- (Zndc)  ---------    (Zwindow)

当插值发生时,光栅化器对 Zwindow 进行线性插值。 因为 Zwindow 与 1/Zview 成正比,所以我们来应用关于 Zview 的透视插值 关于 Zwindow 的线性插值。

但是,在对数深度缓冲区中,它们在顶点着色器中操纵 z 值。 这意味着 Zwindow 值不再与 1/Zview 成比例 并且光栅化器的插值不再正确。

我理解正确吗?我在这里想念什么?

【问题讨论】:

  • 现在浮点深度缓冲区使对数黑客过时了。只需使用浮点缓冲区即可。禁用深度钳制并设置GL_ZERO_TO_ONE 可让您在从零到无穷大的整个深度范围内使用整个浮点精度。
  • @ybungalobill 好的,我会试试的。

标签: c++ opengl buffer depth


【解决方案1】:

我理解正确吗?

是的。

我在这里错过了什么?

对于一个正常工作的对数深度缓冲区,必须在片段着色器中应用每个片段的对数。

有几种方法可以解决这个问题:

  1. 您没有在顶点着色器中使用对数,因此线性插值是正确的,而只是在片段着色器中应用对数失真。这种方法当然很傻,因为精度将被限制在浮点深度缓冲区给你的范围内,而且由于大多数片段会落入窗口空间中的[0.5,1] 区间,所以你基本上有一个固定的精度只使用一个指数,然后再去对数空间不会给你带来太多好处。
  2. 您尝试“修复”片段着色器中错误插值的值,正如 this article 详细描述的那样。
  3. 您执行变体 1,只是以一种不那么愚蠢的方式。精度损失基本上发生在从剪辑空间到 NDC 时的透视分割处(以及在进入窗口空间时再次发生)。您可以简单地将 eye space z 值传递给片段着色器(GPU 会自动为您以透视正确的方式正确插值),然后将对数应用于 that em> 在片段着色器中。

请注意,无论如何,对数深度缓冲区并不是一个好主意,因为它需要您修改每个片段的深度,因此您会失去早期的深度测试以及由此带来的所有性能优势。有像reversed Z 这样的替代品,不会有这样的缺点。

【讨论】:

  • 即使我对片段着色器做了一些事情,我认为插值仍然是错误的,因为插值是在“片段着色器之前”完成的。这是我的核心问题。
  • @society73 我更新了答案,以更清楚地说明“对每个片段应用对数”的意思
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2014-10-01
  • 2016-06-15
相关资源
最近更新 更多