2017-08-27 151 views
2

我想混合raymarching和通常的几何渲染,但我不明白如何正确比较射线与存储在缓冲区中的深度值的距离。OpenGL比较射线距离与深度缓冲区

This drawing will make it clear

在raymarching侧,我已经从眼睛(红点)开始射线。如果您只在固定的射线距离'T'上渲染碎片,则会看到一条曲线(在我的图中为黄色)。我明白这一点,因为如果你从射线源Oa和Ob开始,并在T单位(Oa + T * Da和Ob + T * Db)期间遵循方向Da和Db,则只会看到中间的射线屏幕到达蓝色平面。

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

make it clear

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

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

有一件事我与投影和如何深度值缺少被存储...我假定深度值是从近平面以下从眼睛开始光线的方向的(重新映射)的距离。

编辑: 它似乎写这个问题,帮我一下。我现在看到为什么我们没有看到这种曲线对深度缓冲区的影响:因为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,这是奇怪的,我...

+0

在OpenGL中,不变深度的表面是垂直于摄像机方向的*平面*,而不是球形壳体(这称为直线投影)。因此,从摄像机到平面上某一点的光线距离会随着其与摄像机轴线的偏移距离而双曲*变化。 – meowgoesthedog

回答

2

你过于复杂的问题。没有“曲线效应”,因为飞机不是弯曲的。术语zlitteraly描述它是什么:在一些欧几里德坐标空间中的z坐标。并且在这样的空间z=C将形成与由该空间的距离xy跨越的平面平行,距离为C

所以如果你想要某个点的距离,你还需要考虑xy坐标。在眼睛空间中,摄像机通常位于原点,因此与摄像机的距离归结为length(x_e, y_e, z_e)(这当然是一种非线性操作,会产生您期望的“曲线”)。

+1

非常感谢!你是对的;我迷失了自我。一开始,我遵循[本教程](https://www.gamasutra.com/blogs/DavidArppe/20170405/295240/How_to_get_Stunning_Graphics_with_Raymarching_in_Games.php)。但我认为它有一个错误。在它的GetDistanceFromDepth()函数中,完全像他只考虑z_e,而没有考虑到uv(或文本本身所述的'rd')。 对于这个问题感兴趣的人;有很好的来源:https://www.khronos.org/opengl/wiki/Compute_eye_space_from_window_space – Plaoy3D