我正在尝试混合光线追踪和通常的几何渲染,但我不明白如何正确地比较光线的距离和我缓冲区中存储的深度值。
在光线传输方面,我从眼睛(红点)开始有光线。如果您只在固定光线距离'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
这个术语用来描述它是什么:某个欧几里德坐标空间中的z坐标。在这样一个空间中,z=C
将形成一个平行于该空间的xy
-Axes所跨越的平面,距离C
。
因此,如果你想要距离某个点,你需要考虑x
和y
坐标。在眼睛空间中,相机通常位于原点,因此距离相机的距离可以归结为length(x_e, y_e, z_e)
(当然这是非线性操作,可以创建您期望的“曲线”)。