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を使用していることを確認しようとしましたが、おそらく何か不足しています。
ありがとうございました。 glReadPixels行が問題であり、例外が発生します。私は実際に私が印刷する行には決して到達しません。 GL_REDとfloatを使用すると、GL_DEPTH_COMPONENTから期待される値と同じ0から1の値が返されるため、どのように問題になるかはわかりません。 – scatatat
私は信頼できないデバッガの私の公正な分け前を持っていた...デバッガを妨げるかもしれない最適化がオンになっていますか? gDEBuggerやCodeXLなどのグラフィックスデバッガでアプリケーションを実行しようとしましたが、エラーが発生しましたか? あなたの問題を解決するために私は迷っています。コードは私にはうまく見えます。私はいくつかのglReadPixels列挙型(Mesa)をサポートしていないプラットフォームを使用していました。その結果、標準で定義されているようにOpenGLエラーとデータは書き込まれませんでした。次に、サブセットが事実上非準拠であるため、サポートされているサブセットはOpenGLから照会できません。 – Andreas