我正在实现在QOpenGLWidget中选择3D对象的简单点击功能。为此,我需要将2D鼠标坐标转换为3D世界空间坐标。之前我已经使用QGLWidget实现了整个过程。但是,在使用QOpenGLWidget时,我无法读取像素的GL_DEPTH_COMPONENT:
float z;
glReadPixels(pixel.x, height - pixel.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
'z' 始终为 0。 为了确保我的像素坐标正确,我尝试接收 GL_RGBA 值:
float rgba[4];
glReadPixels((int)p_temp.x(), (int) (viewport[3] - p_temp.y()), 1, 1, GL_RGBA, GL_FLOAT, rgba);
该函数返回正确的像素颜色。
为了使其正常工作,我必须将像素坐标的域从本地更改为父级坐标。这可能是因为GL_VIEWPORT相应地设置为父部件的大小造成的:
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
对于QGLWidget,这将返回:{0, 0, this->width(), this->height()}
对于QOpenGLWidget,这将返回:{0, 0, this->parent()->width(), this->parent()->height()}
顺便提一下,我的OpenGL版本是4.5,并且使用GL_DEPTH_COMPONENT时没有出现任何OpenGL错误。
现在,我有点不知道自己可能错过了什么。有什么想法吗?
glEnable(GL_DEPTH_TEST)
来启用默认的深度缓冲区。在尝试读取深度数据后,我检查了glGetError()
并返回了GL_NO_ERROR
。有趣的是,即使我注释掉了glEnable(GL_DEPTH_TEST)
,它仍然会返回相同的结果,因此我不确定该函数是否考虑了实际上是否存在深度缓冲区以从中读取像素数据。如上所述,无论我点击哪个对象,所有值都为0。 - Basti Vagabond