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

OpenGL将光线距离与深度缓冲区进行比较,opengl,compare,curve,raytracing,depth,Opengl,Compare,Curve,Raytracing,Depth,我试图混合光线行进和通常的几何体渲染,但我不知道如何正确地将距离光线的距离与我存储在缓冲区中的深度值进行比较 在光线行进的一侧,我有从眼睛开始的光线(红点)。如果只渲染固定光线距离“T”处的碎片,您将看到一条曲线(在我的图形中为黄色)。我理解这一点,因为如果从光线原点Oa和Ob开始,在T单位(Oa+T*Da和Ob+T*Db)期间沿着方向Da和Db,您会看到只有屏幕中间的光线到达蓝色平面 现在在几何方面,我直接从gl_FragCoord.z存储值。但我不明白为什么我们看不到这种曲线效应。我在gi

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

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

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

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

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

关于投影和深度值的存储方式,我缺少一点。。。我假设深度值是从眼睛开始的光线方向(重新映射)到近平面的距离

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

因此,我的问题似乎来自于我将深度转换为距离的方式。我使用了以下方法:

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

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

你把事情复杂化了。没有“曲线效果”,因为平面不是弯曲的。术语
z
value大致描述了它是什么:某些欧几里德坐标空间中的z坐标。在这样的空间中,
z=C
将在距离
C
处形成一个平行于该空间的
xy
轴跨越的平面


因此,如果你想知道到某个点的距离,你还需要考虑
x
y
坐标。在眼睛空间中,相机通常位于原点,因此到相机的距离可以归结为
长度(x_e,y_e,z_e)
(这当然是一个非线性操作,它会创建您似乎期望的“曲线”)

在OpenGL中,不变性深度的表面是一个垂直于相机方向的平面,而不是一个球壳(这称为直线投影)。因此,光线从摄影机到平面上某点的距离随其到摄影机轴的偏移距离呈双曲线变化。非常感谢!你说得对;我迷失了自我。开始时,我遵循了。但我认为它有一个错误。在它的GetDistanceFromDepth()中功能,这就像他只考虑z_e,而不考虑uv(或文本中所述的“rd”)。对于对此问题感兴趣的人,有很好的来源: