C++ 对数深度缓冲区方法是否正确插值顶点属性?
我读过关于对数深度缓冲区的文章。它是否正确插值顶点属性? 我以为渲染管道是这样的 顶点着色器->除以w->视口变换->插值->片段着色器C++ 对数深度缓冲区方法是否正确插值顶点属性?,c++,opengl,buffer,depth,C++,Opengl,Buffer,Depth,我读过关于对数深度缓冲区的文章。它是否正确插值顶点属性? 我以为渲染管道是这样的 顶点着色器->除以w->视口变换->插值->片段着色器 (Zclip) ---------------- (Zndc) --------- (Zwindow) 当插值发生时,光栅化器会对Zwindow进行线性插值。 因为Zwindow与1/Zview成正比,所以我们来应用关于Zview的透视插值 关于Zwindow的线性插值 但是,在对数深度缓冲区中,它们在顶点着色器中操纵z值。 这意味着Zwindow
(Zclip) ---------------- (Zndc) --------- (Zwindow)
当插值发生时,光栅化器会对Zwindow进行线性插值。
因为Zwindow与1/Zview成正比,所以我们来应用关于Zview的透视插值
关于Zwindow的线性插值
但是,在对数深度缓冲区中,它们在顶点着色器中操纵z值。
这意味着Zwindow值不再与1/Zview成比例
光栅化器的插值不再正确
我理解正确吗?我错过了什么
我理解正确吗
对
我错过了什么
对于正常工作的对数深度缓冲区,必须在片段着色器中应用每个片段的对数
有两种方法可以实现这一点:
[0.5,1]
区间,因此基本上只使用一个指数就有一个固定的精度,然后再去对数空间也不会有什么好处请注意,对数深度缓冲区无论如何都不是一个好主意,因为它需要修改每个片段的深度,因此您将失去早期深度测试以及由此带来的所有性能好处。也有类似的替代方案不会有这样的缺点。即使我对片段着色器做了一些事情,我认为插值仍然是错误的,因为插值是“在片段着色器之前”完成的。这是我的核心问题。@society73我更新了我的答案,以更清楚地说明我所说的“应用每个片段的对数”是什么意思。如今,浮点深度缓冲区使对数破解过时了。只需使用浮点缓冲区。禁用深度钳位并将
GL\u ZERO\u设置为\u ONE
允许您在从零到无限的整个深度范围内使用整个浮点精度。@ybungalobill好的,我会尝试。