Als Teil eines 3D-Mesh-Viewers, den ich in QT mit QOpenGLWidget mache, muss ich einem Benutzer die Möglichkeit bieten, auf einen Knoten innerhalb des Modells zu klicken. Um die Auswahl nur auf sichtbare Knoten zu beschränken, habe ich versucht, glReadPixels (GL_DEPTH_COMPONENT) in meinen Auswahlalgorithmus aufzunehmen.QOpenGLWidget und glReadPixels und Tiefenpuffer
Mein Problem ist, dass glReadPixels (Tiefe) immer 0 zurückgibt. Alle Fehlerausgaben im folgenden Code geben auch 0 zurück. glReadPixels (rot) liefert korrekte Werte:
GLenum err = GL_NO_ERROR;
QTextStream(stdout) << "error before reading gl_red = " << err << endl;
GLfloat winX, winY, myred, mydepth;
winX = mousex;
winY = this->height() - mousey;
glReadPixels(winX,winY,1,1,GL_RED,GL_FLOAT, &myred);
QTextStream(stdout) << "GL RED = " << myred << endl;
err = glGetError();
QTextStream(stdout) << "error after reading gl_red = " << err << endl;
glReadPixels(winX,winY,1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &mydepth);
QTextStream(stdout) << "GL_DEPTH_COMPONENT = " << mydepth << endl;
err = glGetError();
QTextStream(stdout) << "error after reading gl_depth = " << err << endl;
Mein normales 3D-Rendering funktioniert gut, ich habe glEnable(GL_DEPTH_TEST)
in meiner initializeGL()
Funktion. Im Moment verwende ich keine ausgefallenen VBOs oder VAOs. FaceMeshQualityColor
und triVertices
haben beide den Datentyp QVector<QVector3D>
. Mein aktuelles Gesicht Rendering folgt den folgenden Verlauf:
shader = shaderVaryingColor;
shader->bind();
shader->setAttributeArray("color", FaceMeshQualityColor.constData());
shader->enableAttributeArray("color");
shader->setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
shader->setAttributeArray("vertex", triVertices.constData());
shader->enableAttributeArray("vertex");
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1,1);
glDrawArrays(GL_TRIANGLES, 0, triVertices.size());
glDisable(GL_POLYGON_OFFSET_FILL);
shader->disableAttributeArray("vertex");
shader->disableAttributeArray("color");
shader->release();
In meiner Haupt-Datei Ich habe ausdrücklich meine OpenGL-Version etwas mit glReadPixels (GL_DEPTH_COMPONENT) Funktionalität (im Gegensatz zu OpenGL ES 2.0):
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSurfaceFormat format;
format.setVersion(2, 1);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setDepthBufferSize(32);
QSurfaceFormat::setDefaultFormat(format);
MainWindow w;
w.showMaximized();
return a.exec();
}
Funktioniert mein Problem mit glReadPixels (depth) nicht irgendwie mit meiner Behandlung meines Tiefenpuffers?
Muss ich den Tiefenpuffer 'aktivieren', um von ihm lesen zu können, bevor ich glReadPixels anrufe? Oder muss der Vertex-Shader explizit die Tiefenposition in ein anderes Objekt schreiben?