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

时间:2017-08-27 11:16:30

标签: opengl compare curve raytracing depth

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

This drawing will make it clear

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

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

make it clear

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

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

投影时遗漏了一件事以及深度值的存储方式......我认为深度值是从眼睛开始沿着光线方向从近平面开始的(重新映射)距离。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

因此,如果您希望距离达到某个点,则还需要考虑xy坐标。在眼睛空间中,相机通常位于原点,因此与相机的距离可以归结为length(x_e, y_e, z_e)(这当然是一种非线性操作,可以创建您期望的“曲线”。) p>