gpt4 book ai didi

opengl - 投影矩阵 : What should depth map to?

转载 作者:行者123 更新时间:2023-12-04 07:31:18 28 4
gpt4 key购买 nike

我在尝试为 Vulkan 构建投影矩阵时遇到了矛盾,并且还没有找到关于投影矩阵如何将 Z 从输入向量映射到输出的解释。映射 x 和 y 很简单。我的理解是 OpenGL 投影矩阵应该将近视锥平面映射到 -1,将远平面映射到 +1。 Vulkan 分别为 0 和 +1。映射应该是对数的,以便在近场中获得更高的精度。

下面的示例使用近 (n) = 1,远 (f) = 100。
这是使用我根据 Vulkan 规范构建的矩阵的 z 映射图。它会在渲染中产生错误,但会产生我理解的正确结果:
lambda z: (f / (f-n) * z - f*n/(f-n)) / z enter image description here

我在网上找到的最常见的 OpenGL 投影图,应该从 -1 映射到 +1:
lambda z: ((-f+n)/(f-n)*z - 2*f*n/(f-n))/-z enter image description here

这是从我使用的库生成的,用于 OpenGL(Rust 中的 cgmath):
enter image description here

除非我理解 z 应该映射到什么,否则我无法构建一个合适的 Vulkan 投影矩阵(我没有通过谷歌找到它)。我怀疑这是由于着色器在投影后矩阵进行了隐式校正,实际上映射到我列出的范围,但如果是这样,我不知道通过 proj mat 输入什么范围。

最佳答案

The mapping should be logarithmic, allowing greater precision in the near field.



实际上,如果您不做任何技巧,映射将是双曲线的,而不是对数的。双曲线映射的关键点在于,您实际上可以在屏幕空间中线性地对其进行插值(当您想要进行一些 Z 缓冲区优化(如 Hierarchical Z)时,这是一个非常好的属性)。

A plot of the most common OpenGL projection I've found online, which should map from -1 to +1:

lambda z: ((-f+n)/(f-n)*z - 2*f*n/(f-n))/-z 


不。你在第一学期有一个符号错误,应该是
(-(f+n)/(f-n)*z - 2*f*n/(f-n))/-z 

因此,你的情节是错误的。使用更正后的公式,您将获得与您的 cgmath 相似的图。锈库。

但重要的是另一件事:你在策划错误的事情!
请注意 -z在那个公式的分母上?经典的 GL 惯例一直是使用右手眼空间,但使用左手窗口空间。因此,经典的 GL 投影矩阵沿 -z 投影。方向。参数 nf尽管如此,仍然以沿观察方向的距离给出。这意味着,实际剪裁平面将在 z_eye = -nz_eye=-f在眼睛空间。您在图表中绘制的是相机后面的范围,您将看到夸张的第二个分支,通常会被剪掉,并将映射到 [-1,1] 之外。间隔。

如果绘制 n=5 和 f=100 的映射,您将得到:
plot of hyperbolic Z function

注意OpenGL的工程变成 -z方向是纯粹的约定,它不受任何强制,因此您可以使用 +z投影矩阵。

I'm unable to build a proper Vulkan projection matrix (Of which I've found none via Google) unless I understand what z should map to. Here's a plot of z mapping using a matrix I constructed to the Vulkan spec. It produces errors in rendering, but produces the correct result as I understand it:

lambda z: (f / (f-n) * z - f*n/(f-n)) / z 


不知道你看到了什么错误,但如果你看到映射是正确的
  • 假设 vulkan 的默认 [0,1] z 剪辑约定,以及
  • 想要沿 +z 的投影方向在眼睛空间。

  • 顺便提一句。火神 [0,1]剪辑约定还可以在使用浮点深度附件时更好地使用精度:通过反转映射,将近平面映射到 1,将远平面映射到 0,您可以显着提高精度。看看 this nvidia devblog article更多细节。

    关于opengl - 投影矩阵 : What should depth map to?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893875/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com