opengl - 为什么深度值必须直接通过 openGL 中的重心坐标进行插值?

标签 opengl glsl interpolation

OpenGL 规范:

OpenGL

它说:但是,多边形的深度值必须通过 (14.10) 进行插值。

为什么? z 坐标深度值是相机空间中的吗?如果是这样,我们应该使用正确的透视重心坐标来插值它们,不是吗?(​​如方程14.9)

更新:
所以z坐标是NDC坐标(已经除以w)。我有一个实现光栅化器的小演示。当我使用 NDC z 坐标的线性插值时,结果有点不寻常(下图)。当我正确使用相机 z 坐标的透视插值时,结果是好的。

enter image description here

这是我使用的透视投影矩阵: enter image description here

最佳答案

Why? Are the z coordinates depth values in camera space? If so, we should use perspective correctly barycentric coordinates to interpolate them, isn't it?

不,他们不是。它们位于窗口空间中,这意味着它们已经被 w 除。如果您想对摄像机空间 z 进行插值,则必须应用透视校正,这是正确的。但对于 NDC 和窗口空间 Z 来说,这是错误的 - 毕竟,透视变换(通过透视投影矩阵和透视除法实现)仍然将直线映射到直线,将平面三角形映射到平面三角形。这就是为什么我们首先使用双曲扭曲的 Z 值作为深度。这也是用于分层深度测试优化的属性。看看at my answer here了解更多详细信息,包括一些图表。

关于opengl - 为什么深度值必须直接通过 openGL 中的重心坐标进行插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74261146/

相关文章:

python - 尝试使用 scipy 插入 2D 数据 - 只获取 NaN 数组

opengl - 是否有(现代)OpenGL 的 Clojure 包装器?

opengl - 如何更改一个顶点而不是所有顶点的颜色?

macos - glTexSubImage2D 将 NSImage 移动一个像素

opengl - 将计算着色器输出渲染到屏幕

c++ - glBufferData 上的段错误

opengl - 为什么OpenGL使用float而不是double?

c++ - 通过曲面 segmentation 着色器传递颜色

matlab - Matlab中二维插值的函数形式

python - 将自定义函数插入 pandas 系列