提问人:ZjuTh 提问时间:11/6/2023 最后编辑:ZjuTh 更新时间:11/7/2023 访问量:39
glReadPixels() 无法获取有关 QOpenGLWidget 的正确信息
glReadPixels() cannot get the correct information on QOpenGLWidget
问:
我曾在Qt框架中使用QOpenGLWidget开发显示应用程序。
渲染所需的对象在类中定义。在此类中,构造函数需要指针“QOpenGLFunctions_4_5_Core *gl”。示例是 并且有一个函数使用指针调用 glfunctions 进行渲染。
我有不同类型的对象要渲染,我使用不同的 QMap 来管理它们。我覆盖了paintGL(),就像 CubesContour(resultData &result, float isolevel, int valNo, int colorNums, colorScheme scheme, QOpenGLFunctions_4_5_Core *gl);
if(model_DisplayMap.size() > 0)
{
for(auto i : this->model_DisplayMap)
{
//i->draw(1, this->m_camera);
//i->drawLight(1, this->m_camera);
i->drawbyFaceNormal(1, this->m_camera);
}
}
if(ruler_DisplayMap.size() > 0)
{
for(auto i : this->ruler_DisplayMap)
{
i->draw(1, this->m_camera);
}
}
if(colormap_DisplayMap.size() > 0)
{
for(auto i : this->colormap_DisplayMap)
{
i->drawColorMapbyPostion(1, this->m_camera);
i->drawText(i->Usernumber, i->phyName);
}
}
...
现在我想获得光标左键单击时的深度。我覆盖了mousePressEvent(),就像
void myOpenglWid_first::mousePressEvent(QMouseEvent *event)
{
makeCurrent();
if(event->buttons()&Qt::LeftButton)
{
float z = getDepthValue(event->pos().x(), event->pos().y());
qDebug() << "depth:" << z;
}
doneCurrent();
}
float myOpenglWid_first::getDepthValue(int x, int y)
{
float winZ;
glReadPixels(
x,
this->height() - y
, 1, 1
, GL_DEPTH_COMPONENT, GL_FLOAT
, &winZ);
return winZ;
}
深度的输出是 0 或数字,每个位置都非常接近于零。
我还测试了 glReadPixels() 的GL_RED GL_GREEN和GL_BLUE
float myOpenglWid_first::getColorValue(int RGB, int x, int y)
{
makeCurrent();
float color = 0;
if(RGB == 0)
{
glReadPixels(x, this->height() - y, 1, 1, GL_RED, GL_FLOAT, &color);
}
else if(RGB == 1)
{
glReadPixels(x, this->height() - y, 1, 1, GL_GREEN, GL_FLOAT, &color);
}
else if(RGB == 2)
{
glReadPixels(x, this->height() - y, 1, 1, GL_BLUE, GL_FLOAT, &color);
}
doneCurrent();
return color;
}
它们的输出都是零。 我认为使用指针渲染对象时应该有一些错误吗?尽管可以正确显示对象,但上下文会混淆,并且当调用“mousePressEvent”时,函数不会读取应读取的缓冲区。以上都是我的猜测,因为当使用一个简单的例子(直接在paintGL中渲染一个盒子)时,深度和颜色的输出是正确的。或者,在使用 QOpenGLWidget 时,可能有一些更好的方法来管理各种渲染对象?
答: 暂无答案
评论
"The output of depth is 0 or number which very closed to zero for each position"
"Each component is clamped to the range [0,1]"