opengl glReadPixels GL_DEPTH_COMPONENT使QT应用程序崩溃

alen0pnh  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(377)

我想在QT应用程序中使用glReadPixels和GL_DEPTH_COMPONENT,以确保用户只能用鼠标选择可见顶点。当我尝试这样做时,应用程序崩溃,并显示以下错误:
qtopenglsphere.exe中0x 00007 FFF 94 E60823(ig75icd64.dll)处的未处理异常:数据类型:阅读位置0x 000000000000000 A8时发生访问冲突。
注意事项:

  • 将glreadpixels与GL_RED一起使用会返回正确的结果
  • 我的集成GPU是英特尔HD 4600. ig 75 icd 64. dll在上面的错误似乎是它的OpenGL驱动程序。“OpenGL扩展查看器”报告这个GPU是100%兼容OpenGL 4. 3和更早的版本。
  • 目前,程序正在透视图中绘制一个3D立方体,并启用了深度测试,立方体看起来很好。

Main.cpp


# include "mainwindow.h"

# include <QApplication>

# include <QOpenGLFunctions>

# include <QTextStream>

int main(int argc, char *argv[])
{
    QSurfaceFormat format;
    format.setSamples(16);
    format.setDepthBufferSize(24);
    QSurfaceFormat::setDefaultFormat(format);
    format.setRenderableType(QSurfaceFormat::OpenGL);
    format.setVersion(4, 0);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
  • 初始化GL()
void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0,0,0,1);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);

    shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex,
        "uniform mat4 mvpMatrix;\n"
        "in vec4 vertex;\n"
        "in vec4 color;\n"
        "out vec4 varyingColor;\n"
        "void main(void)\n"
        "{\n"
        "varyingColor = color;\n"
        "gl_Position = mvpMatrix * vertex;\n"
        "}");
    shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment,
        "in vec4 varyingColor;\n"
        "out vec4 fragColor;\n"
        "void main(void)\n"
        "{\n"
        "   gl_FragColor = varyingColor;\n"
        "}");
    shaderProgram.link();

<definition of cube vertices>

}

()函数调用

void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    mMatrix.setToIdentity();
    vMatrix.setToIdentity();

    QMatrix4x4 cameraTransformation;
    cameraTransformation.rotate(alpha, 0, 1, 0);
    cameraTransformation.rotate(beta, 1, 0, 0);
    QVector3D cameraPosition = cameraTransformation* QVector3D(0, 0, distance);
    QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0);
    QVector3D cameratranslate(panx,pany,0);
    cameratranslate = cameraTransformation*cameratranslate;
    cameraPosition += cameratranslate;
    vMatrix.lookAt(cameraPosition, cameratranslate, cameraUpDirection);

    shaderProgram.bind();
    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");
    shaderProgram.setAttributeArray("color", colors.constData());
    shaderProgram.enableAttributeArray("color");
    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
    shaderProgram.disableAttributeArray("vertex");
    shaderProgram.disableAttributeArray("color");

    shaderProgram.release();
}

glwidget.cpp -查找选定的顶点(Q点)

void GLWidget::findSelectedVertex(QPoint clickpoint)
{
    float mousex = clickpoint.x();
    float mousey = clickpoint.y();
    float renderedPixelDepth;
    glReadPixels(mousex,height()-mousey,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&renderedPixelDepth);// EXCEPTION THROWN HERE
    QTextStream(stdout) << "Clicked point value = " << renderedPixelDepth << endl;
}

我觉得很奇怪,我可以将glReadPixels与GL_RED一起使用,但不能与GL_DEPTH_COMPONENT一起使用。我已经尝试确保我使用的是OpenGL4.0而不是OpenGL ES 2.0(它没有GL_DEPTH_COMPONENT),但可能我遗漏了一些东西。

kjthegm6

kjthegm61#

相容的OpenGL实作不允许掷回例外状况,因为提供枚举或值给驱动程序不支援的作业,例如GL_DEPTH_COMPONENTglReadPixels。如果不支援,作业会记录可由glGetError撷取的错误,并继续执行,就像从未呼叫过作业一样。
您不清楚哪一行崩溃。我的猜测是glReadPixels操作失败,因为GL_DEPTH_COMPONENT + GL_FLOAT不受支持,并且现在未初始化的浮点数导致打印操作出现问题。如果这就是抛出异常的原因。

acruukt9

acruukt92#

glReadPixels和GL_DEPTH_COMPONENT在英特尔上确实有问题。我也遇到过同样的问题。在英特尔显卡以外的其他硬件上都没有问题。
我通过使用另一种缓冲区格式摆脱了崩溃。GL_BGR
现在,它可以在所有英特尔显卡上运行,测试了约10种不同的显卡。

相关问题