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

标签 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 中编辑了这张图片,并使用“海报化”功能使其清晰。

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,这对我来说很奇怪......

最佳答案

你把事情搞得太复杂了。不存在“曲线效应”,因为平面不是弯曲的。术语zlitteraly描述了它是什么:某些欧几里得坐标空间中的z坐标。在这样的空间中,z=C 将与该空间的 xy 轴所跨越的平面平行,距离为 C

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

关于OpenGL将光线距离与深度缓冲区进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45904365/

相关文章:

PHP/MySQL - 比较 2 个不同数据库中的表

opengl - 在OpenGL中绘制Hermite曲线

c++ - 用opengl画图SDL Renderer就没用了吗?

c++ - 为什么 glScaled(1, 1, 5) 会改变 glVertex3d(1, 1, 0) 的光照?

c++ - 在 C++ 中实现 S 型曲线

svg - 自行车车轮路径和贝塞尔曲线

python - 在图像中绘制隐式函数(Python,[OpenCV])

c++ - 纹理坐标是否经过各种 Shader 管道?

html - Firefox 3 vs Firefox 4 开发差异?

c - 如何在 C 中比较两个不区分大小写的字符?