glReadPixels() 无法获取有关 QOpenGLWidget 的正确信息

glReadPixels() cannot get the correct information on QOpenGLWidget

提问人:ZjuTh 提问时间:11/6/2023 最后编辑:ZjuTh 更新时间:11/7/2023 访问量:39

问:

我曾在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 时,可能有一些更好的方法来管理各种渲染对象?

C++ Qt OpenGL

评论

0赞 G.M. 11/7/2023
编辑您的问题以解释/澄清您的问题。回复:为什么不呢?从文档中: ."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]"
0赞 ZjuTh 11/7/2023
我已经在 OpenGLWidget 中渲染了一个模型,模型上的深度应该不同。但它是 0 或 4.59163e-41(一个很小的常数,当导入不同的模型时,它不会改变)。显然,这是错误的。模型具有不同的 z 值,当我单击模型上的不同位置时,输出应该不同。

答: 暂无答案