gpt4 book ai didi

opengl - 如何将 OpenGL 正交投影与深度缓冲区一起使用?

转载 作者:行者123 更新时间:2023-12-02 08:53:41 26 4
gpt4 key购买 nike

我使用 glFrustum() 透视模式渲染了 3D 场景。然后,我将一个 2D 对象放置在 3D 场景上,作为特定 3D 对象的标签。我使用 gluProject() 计算了 3D 对象的 2D 位置,然后在该位置放置 2D 标签对象。 2D 标签对象使用 glOrtho() 正交模式渲染。这工作得很好,2D 标签对象悬停在 3D 对象上。

现在,我想要做的是给 2D 对象一个 z 值,以便可以使用深度缓冲区将其隐藏在场景中其他 3D 对象后面。我给了 2D 对象一个 z 值,我知道该值应该被深度缓冲区隐藏,但是当我渲染该对象时,它始终可见。

所以问题是,为什么 2D 对象仍然可见而不是隐藏?

我确实在某处读到正交投影和透视投影存储不兼容的深度缓冲区值。这是真的吗?如果是,我该如何在它们之间进行转换?

最佳答案

I don't want it to be transformed, instead I want it to appear as flat 2D label that always faces the camera and remains the same size on the screen at all times. However, if it is hidden behind something I want it to appear hidden.

首先,您应该将那个放入您的问题中;它比你的问题更能解释你想要做什么。

要实现此目的,您需要做的是在正交投影中找到与您希望标 checkout 现的位置的预投影空间中的 z 坐标相匹配的 z 坐标。

当您使用gluProject时,您得到了三个坐标。 Z 坐标很重要。您需要做的是根据您为 glOrtho 提供的 zNear 和 zFar 值对 Z 坐标进行反向变换。

迂腐的注释: gluProject 不会将 Z 坐标转换为窗口空间。为此,它必须采用 glDepthRange 参数。它真正做的是假设深度范围近 = 0.0 和远 = 1.0。

所以我们的第一步是从窗口空间 Z 转换到标准化设备坐标 (NDC) 空间 Z。我们使用这个简单的方程:

ndcZ = (2 * winZ) - 1

足够简单。现在,我们需要进入剪辑空间。这是一个空操作,因为在正交投影中,W 坐标被假定为 1.0。除以W就是剪辑空间和NDC空间的差。

clipZ = ndcZ

但是我们不需要剪辑空间 Z。我们需要预正交投影空间 Z(又名:相机空间 Z)。这需要您为 glOrtho 提供的 zNear 和 zFar 参数。为了进入相机空间,我们这样做:

cameraZ = ((clipZ + (zFar + zNear)/(zFar - zNear)) * (zFar - zNear))/-2

你就完成了。在渲染中使用该 Z 位置。哦,并确保您的模型 View 矩阵不包含 Z 方向上的任何变换(除非您使用模型 View 矩阵将此 Z 位置应用于标签,这很好)。

关于opengl - 如何将 OpenGL 正交投影与深度缓冲区一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com