我想混合raymarching和通常的几何渲染,但我不明白如何正确比较射线与存储在缓冲区中的深度值的距离。OpenGL比较射线距离与深度缓冲区
在raymarching侧,我已经从眼睛(红点)开始射线。如果您只在固定的射线距离'T'上渲染碎片,则会看到一条曲线(在我的图中为黄色)。我明白这一点,因为如果你从射线源Oa和Ob开始,并在T单位(Oa + T * Da和Ob + T * Db)期间遵循方向Da和Db,则只会看到中间的射线屏幕到达蓝色平面。
现在在几何方面,我直接从gl_FragCoord.z存储值。但我不明白为什么我们在那里看不到这种弯曲的效果。我用瘸子编辑了这张照片,用'posterize'功能来表达清楚。
我们看到直线,而不是曲线。
我这个深度值转换为距离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,这是奇怪的,我...
在OpenGL中,不变深度的表面是垂直于摄像机方向的*平面*,而不是球形壳体(这称为直线投影)。因此,从摄像机到平面上某一点的光线距离会随着其与摄像机轴线的偏移距离而双曲*变化。 – meowgoesthedog