2016-03-27 22 views
0

QTアプリケーションでglReadPixelsをGL_DEPTH_COMPONENTとともに使用して、ユーザーがマウスで表示可能な頂点のみを選択できるようにします。私はそうしようとすると、次のエラーと私のアプリケーションがクラッシュ:glReadPixels GL_DEPTH_COMPONENTがQTアプリケーションをクラッシュさせます

Unhandled exception at 0x00007FFF94E60823 (ig75icd64.dll) in qtopenglsphere.exe: 0xC0000005: Access violation reading location 0x00000000000000A8.

ノートのカップル:

glreadpixelsを使用して
  • GL_REDでは正しい結果を返します

  • 私の統合されたGPUであります上記のエラーのIntel HD 4600.ig75icd64.dllは、そのためのOpenGLドライバのようです。 「OpenGL拡張ビューア」は、このGPUがOpenGL 4.3以前と100%互換性があることを報告します。

  • このプログラムでは、深度テストが有効になっており、キューブがうまく見える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(); 
} 

glwidget.cpp - initialiseGL()

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> 

} 

glwidget.cpp - paintGL()

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 - findSelectedVertex (QPoint)

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では使用できないことは奇妙に思えます。私はOpenGL ES 2.0(GL_DEPTH_COMPONENTを持たない)の代わりにOpenGL4.0を使用していることを確認しようとしましたが、おそらく何か不足しています。

答えて

0

GL_DEPTH_COMPONENTglReadPixelsのように、対応するOpenGL実装では、ドライバによってサポートされていない操作に列挙型または値を提供するため、例外をスローすることはできません。サポートされていない場合、操作はglGetErrorで取得可能なエラーを記録し、操作が呼び出されなかったかのように処理します。

クラッシュする行が明確ではありません。私の推測では、GL_DEPTH_COMPONENT + GL_FLOATのために、glReadPixelsの操作が失敗し、現在は初期化されていないfloatが印刷操作に問題を引き起こしていると思います。例外がどこからスローされたのかが分かります。

+0

ありがとうございました。 glReadPixels行が問題であり、例外が発生します。私は実際に私が印刷する行には決して到達しません。 GL_REDとfloatを使用すると、GL_DEPTH_COMPONENTから期待される値と同じ0から1の値が返されるため、どのように問題になるかはわかりません。 – scatatat

+0

私は信頼できないデバッガの私の公正な分け前を持っていた...デバッガを妨げるかもしれない最適化がオンになっていますか? gDEBuggerやCodeXLなどのグラフィックスデバッガでアプリケーションを実行しようとしましたが、エラーが発生しましたか? あなたの問題を解決するために私は迷っています。コードは私にはうまく見えます。私はいくつかのglReadPixels列挙型(Mesa)をサポートしていないプラットフォームを使用していました。その結果、標準で定義されているようにOpenGLエラーとデータは書き込まれませんでした。次に、サブセットが事実上非準拠であるため、サポートされているサブセットはOpenGLから照会できません。 – Andreas

関連する問題