OpenGL 比较光线距离与深度缓冲区

OpenGL compare ray distance with depth buffer

我正在尝试混合光线行进和通常的几何渲染,但我不明白如何正确地将光线的距离与我存储在缓冲区中的深度值进行比较。

在光线行进方面,我有从眼睛(红点)开始的光线。如果您只渲染固定光线距离 'T' 处的片段,您将看到一条曲线(在我的绘图中为黄色)。我理解这一点,因为如果你从射线原点 Oa 和 Ob 开始,并在 T 单位(Oa + T * Da 和 Ob + T * Db)期间沿着方向 Da 和 Db,你会看到只有中间的射线屏幕到达蓝色平面。

现在在几何方面,我直接从 gl_FragCoord.z 存储值。但我不明白为什么我们在那里看不到这种弯曲的效果。我在 gimp 中编辑了这张图片,使用 'posterize' 功能使其清晰。

我们看到的是直线,而不是曲线。

我可以将这个深度值转换为距离(考虑到线性化)。但是当比较两个距离时,我的屏幕一侧出现了问题。

投影和深度值的存储方式让我遗漏了一件事...我假设深度值是从眼睛开始的光线方向到近平面的(重新映射)距离。

编辑: 看来写这个问题对我有点帮助。我现在明白了为什么我们看不到深度缓冲区的曲线效果:因为对于我屏幕一侧的光线来说,Near 和 Far 之间的距离更大。因此,即使深度值相同(中间或侧面屏幕),距离也不相同。

因此看来我的问题出在我将深度转换为距离的方式上。我使用了以下内容:

float z_n = 2.0 * mydepthvalue - 1.0;
float z_e = 2.0 * zNear * zFar / (zFar + zNear - z_n * (zFar - zNear));

但是,在转换之后,我仍然没有看到我需要与我的光线距离进行比较的曲线效果。请注意,此代码没有考虑 FragCoord.x 和 .y,这对我来说很奇怪...

你把事情复杂化了。没有 "curve effect" 因为平面不是弯曲的。术语 z value litteraly 描述了它是什么:z coordinate 在一些欧氏坐标space。在这样的 space 中,z=C 将与 space 的 xy 轴所跨越的平面平行,距离为 C.

所以如果你想要到某个点的距离,你还需要考虑 xy 坐标。在眼睛 space 中,相机通常位于原点,因此到相机的距离归结为 length(x_e, y_e, z_e)(这当然是一种非线性操作,会产生你看起来的 "curve"期待)。