c++ - 如何为 GL_SELECT 缓冲区启用深度测试?

标签 c++ opengl graphics selection 3d

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

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

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

最佳答案

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

参见 jerome's tutorialnehe's tutorial关于选择。

关于c++ - 如何为 GL_SELECT 缓冲区启用深度测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614518/

相关文章:

c++ - Vector::push_back() 给出读取访问冲突

c - 为什么核心配置文件不起作用?

c++ - 灰度中的 glDrawPixels?

ios - 缩放 OpenGL ES 帧缓冲区的内容

graphics - 在 C++ 中以编程方式使用高斯滤波器填充 nxn 矩阵

只能隐式构造的C++11类?

c++ - 在 C 程序中解析 32 位整数

c++ - 欧拉数展开

c++ - 引擎测试 : Rendering a Cube on the Screen (OpenGL)

javascript - 在 HTML5 <canvas> 上绘制不同视角的模型