我正在使用GL选择缓冲区来实现鼠标选择。不幸的是,即使对于完全被遮挡的对象,OpenGL也会在选择缓冲区中返回命中。例如,如果墙后面隐藏着一名男子,则选择缓冲区将包含该男子的命中记录,即使他不可见。
选择大致按照OpenGL Programming Guide中描述的方式实现:切换到GL_SELECT渲染模式 - glRenderMode(GL_SELECT) - 渲染场景,然后解析选择缓冲区。深度缓冲和深度测试已启用,但GL似乎忽略了GL_SELECT模式中的深度设置。
OpenGL是否可以在GL_SELECT模式下进行深度剔除?是否有另一种方法可以丢弃隐藏对象的命中记录而无需使用其他方法重新实现选择?
答案 0 :(得分:3)
选择缓冲区将为您提供与鼠标位置匹配的所有对象,无论相机的深度如何。由您决定是否需要最近,最远或所有对象。请记住,鼠标仅适用于2D世界,并且正在尝试选择3D空间。想象一下,在您单击鼠标的x,y坐标处射出-z方向的射线。与该光线相交的所有对象都将在选择缓冲区中返回。听起来你想选择最近的一个。
选择时请参阅jerome's tutorial和nehe's tutorial。
答案 1 :(得分:0)
OpenGL编程指南中的processHits函数显示了如何在命中位置获取对象的z值。使用z值对对象进行排序并选择最接近的对象。