【问题标题】:How to enable depth testing for the GL_SELECT buffer?如何启用 GL_SELECT 缓冲区的深度测试?
【发布时间】:2010-09-01 01:49:53
【问题描述】:

我正在使用 GL 选择缓冲区来实现鼠标拾取。不幸的是,即使是完全被遮挡的对象,OpenGL 也会在选择缓冲区中返回命中。例如,如果有一个人隐藏在墙后,即使该人不可见,选择缓冲区也会包含该人的命中记录。

Selection 的实现方式大致如OpenGL Programming Guide 中所述:切换到 GL_SELECT 渲染模式 -- glRenderMode(GL_SELECT) -- 渲染场景,然后解析选择缓冲区。启用了深度缓冲和深度测试,但 GL 似乎忽略了 GL_SELECT 模式下的深度设置。

OpenGL 是否可以在 GL_SELECT 模式下进行深度剔除?是否有另一种方法可以丢弃隐藏对象的命中记录而不使用其他方法重新实现选择?

【问题讨论】:

    标签: c++ opengl graphics selection 3d


    【解决方案1】:

    选择缓冲区将为您提供与您的鼠标位置匹配的所有对象,无论相机的深度如何。由您决定是否需要最近、最远或所有对象。请记住,鼠标仅在 2D 世界中工作,并且正在尝试为 3D 空间进行选择。想象一条射线在您单击鼠标的 x,y 坐标处射向 -z 方向。在选择缓冲区中返回与该射线相交的所有对象。听起来您想选择最接近的。

    请参阅jerome's tutorialnehe's tutorial 进行选择。

    【讨论】:

    • 我从您的回答中推断,无法在 GL_SELECT 模式下启用深度测试,因此可以回答我的问题。不幸的是,我正在实现选取框选择(选择框中的所有内容),因此光线拾取是不够的,选择具有最小 Z 值的选择缓冲区条目也是如此。谢谢!
    【解决方案2】:

    OpenGL 编程指南中的 processHits 函数显示了如何获取对象在命中位置的 z 值。使用 z 值对对象进行排序并选择最接近的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多