C++ 对数深度缓冲区方法是否正确插值顶点属性?

C++ 对数深度缓冲区方法是否正确插值顶点属性?,c++,opengl,buffer,depth,C++,Opengl,Buffer,Depth,我读过关于对数深度缓冲区的文章。它是否正确插值顶点属性? 我以为渲染管道是这样的 顶点着色器->除以w->视口变换->插值->片段着色器 (Zclip) ---------------- (Zndc) --------- (Zwindow) 当插值发生时,光栅化器会对Zwindow进行线性插值。 因为Zwindow与1/Zview成正比,所以我们来应用关于Zview的透视插值 关于Zwindow的线性插值 但是,在对数深度缓冲区中,它们在顶点着色器中操纵z值。 这意味着Zwindow

我读过关于对数深度缓冲区的文章。它是否正确插值顶点属性? 我以为渲染管道是这样的

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

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

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

我理解正确吗?我错过了什么

我理解正确吗

我错过了什么

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

有两种方法可以实现这一点:

  • 在顶点着色器中不使用对数,因此线性插值是正确的,而只是在片段着色器中应用对数失真。这种方法当然很愚蠢,因为精度将被限制在浮点深度缓冲区所能提供的范围内,而且由于大多数片段将落入窗口空间中的
    [0.5,1]
    区间,因此基本上只使用一个指数就有一个固定的精度,然后再去对数空间也不会有什么好处
  • 您尝试在片段着色器处“修复”错误的插值,如详细所述
  • 您可以使用变体1,只是用一种不那么愚蠢的方式。从剪辑空间到NDC(再到窗口空间)时,精度损失基本上发生在透视分割处。只需将眼空间z值传递给片段着色器(GPU会自动以透视正确的方式正确插值),然后在片段着色器中对其应用对数即可
    请注意,对数深度缓冲区无论如何都不是一个好主意,因为它需要修改每个片段的深度,因此您将失去早期深度测试以及由此带来的所有性能好处。也有类似的替代方案不会有这样的缺点。

    即使我对片段着色器做了一些事情,我认为插值仍然是错误的,因为插值是“在片段着色器之前”完成的。这是我的核心问题。@society73我更新了我的答案,以更清楚地说明我所说的“应用每个片段的对数”是什么意思。如今,浮点深度缓冲区使对数破解过时了。只需使用浮点缓冲区。禁用深度钳位并将
    GL\u ZERO\u设置为\u ONE
    允许您在从零到无限的整个深度范围内使用整个浮点精度。@ybungalobill好的,我会尝试。