我正在使用 GL 选择缓冲区来实现鼠标拾取。不幸的是,即使对于完全被遮挡的对象,OpenGL 也会在选择缓冲区中返回命中。例如,如果有一个人躲在墙后,即使他不可见,选择缓冲区也会包含该人的命中记录。
选择大致按照 OpenGL Programming Guide 中描述的方式实现: 切换到 GL_SELECT 渲染模式 -- glRenderMode(GL_SELECT) -- 渲染场景,然后解析选择缓冲区。启用了深度缓冲区和深度测试,但 GL 似乎忽略了 GL_SELECT 模式下的深度设置。
OpenGL 是否可以在 GL_SELECT 模式下进行深度剔除?是否有另一种方法可以丢弃隐藏对象的命中记录,而无需使用其他方法重新实现选择?
最佳答案
选择缓冲区将为您提供与鼠标位置匹配的所有对象,而不管相机的深度如何。由您决定是想要最近的、最远的还是所有的对象。请记住,鼠标只能在 2D 世界中工作,并且正在尝试为 3D 空间进行选择。想象一条光线在您单击鼠标的 x,y 坐标处射向 -z 方向。与该射线相交的所有对象都返回到选择缓冲区中。听起来你想选择最接近的。
参见 jerome's tutorial和 nehe's tutorial关于选择。
关于c++ - 如何为 GL_SELECT 缓冲区启用深度测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614518/