【发布时间】:2012-02-17 22:19:16
【问题描述】:
我使用glFrustum() 透视模式渲染了一个 3D 场景。然后,我将一个 2D 对象放置在 3D 场景上,作为特定 3D 对象的标签。我已经使用 gluProject() 计算了 3D 对象的 2D 位置,然后将我的 2D 标签对象放置在该位置。使用glOrtho() 正交模式渲染二维标签对象。这可以完美运行,并且 2D 标签对象悬停在 3D 对象上。
现在,我要做的是给 2D 对象一个 z 值,以便它可以使用深度缓冲区隐藏在场景中的其他 3D 对象后面。我已经给 2D 对象一个 z 值,我知道它应该被深度缓冲区隐藏,但是当我渲染对象时它总是可见的。
那么问题来了,为什么二维对象仍然可见而不是隐藏?
我确实在某处读到过正交投影和透视投影存储不兼容的深度缓冲区值。这是真的吗?如果是,我该如何在它们之间进行转换?
【问题讨论】:
-
如果你想让标签表现得像一个普通的 3D 对象(隐藏在其他对象后面等等),为什么不把它像一个普通的 3D 对象一样直接绘制在被标记对象的上方(或旁边)呢?
-
我不希望它表现得像一个普通的 3D 对象。我不希望它被转换,而是希望它显示为始终面向相机并始终在屏幕上保持相同大小的平面 2D 标签。但是,如果它隐藏在某些东西后面,我希望它看起来是隐藏的。
-
如何设置二维对象深度?提交 Z 值还是使用 PolygonOffset?
-
我只是将对象的 z 值设置为一个大的 -ve 数,理论上应该隐藏在场景中所有 3D 对象的后面
标签: opengl buffer depth orthographic