2016-03-26 6 views
0

Ich habe vor kurzem mein erstes OpenGL-Programm gemacht, das einen Würfel rendert, den ich um einige andere grundlegende Eigenschaften erweitert habe (Drehen, Zoom, Schwenken, Mausauswahl von Scheitelpunkten). Ich denke jedoch, dass das Programm eine Version von OpenGL ES x.x verwendet, weil ich glReadPixels mit gl_depth_component nicht verwenden konnte, um die Mausauswahl nur für sichtbare Scheitelpunkte zu aktivieren.OpenGL mit QT-Fehler: ASSERT: "QOpenGLFunctions :: isInitialized (d_ptr)". Konnte keinen OpenGL-Kontext erzeugen

Um dies zu beheben, habe ich mein altes Programm geändert, um das Standardoberflächenformat in meiner Hauptfunktion zu OpenGL Version 3.0 manuell anzugeben, aber jetzt das Programm den folgenden Fehler beim Erstellen einer Instanz von GLWidget verursacht.

ASSERT: "QOpenGLFunctions :: isInitialized (d_ptr)"

Meine Hauptfunktion (main.cpp):

#include "mainwindow.h" 
#include <QApplication> 
#include <QOpenGLFunctions> 


int main(int argc, char *argv[]) 
{ 
    QSurfaceFormat format; 
    format.setSamples(16);  
    format.setDepthBufferSize(24); 
    format.setVersion(3,0); 
    format.setProfile(QSurfaceFormat::CoreProfile); 
    QSurfaceFormat::setDefaultFormat(format); 
    QApplication a(argc, argv); 
    MainWindow w;           //breakpoint here - step into 
    w.show(); 
    return a.exec(); 
} 

in diesen Haltepunkt Stepping führt mich zu meinem Mainwindow-Konstruktor (mainwindow.cpp) :

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this);          //breakpoint here - step into 
    ui->GLwidget2->getmainwindowpointer(this); 
    connect(ui->actionTop,SIGNAL(triggered()),ui->GLwidget2,SLOT(settopview())); 
    connect(ui->actionRight, SIGNAL(triggered()), ui->GLwidget2, SLOT(setrightview())); 
    connect(ui->actionIso,SIGNAL(triggered()),ui->GLwidget2,SLOT(setisoview())); 
    //connect(ui->checkBox_perspective,SIGNAL(released()),ui->GLwidget2,SLOT(setperspective())); 
    connect(ui->checkBox_legend, SIGNAL(released()), ui->GLwidget2, SLOT(setlegend())); 
    connect(ui->checkBox_edges, SIGNAL(released()), ui->GLwidget2, SLOT(setedges())); 
    connect(ui->checkBox_faces, SIGNAL(released()), ui->GLwidget2, SLOT(setfaces())); 
    connect(ui->actionFind_vertex,SIGNAL(triggered(bool)),ui->GLwidget2,SLOT(startvertexsearch())); 
    connect(ui->actionFit_to_screen,SIGNAL(triggered()),ui->GLwidget2,SLOT(fittoscreen())); 
    connect(ui->pushButton_selectMode,SIGNAL(released()),ui->GLwidget2,SLOT(setSelectMode())); 
    connect(ui->pushButton_cancelSelect,SIGNAL(released()),ui->GLwidget2,SLOT(setCancelSelectMode())); 
} 

Treten in diesen Haltepunkt führt mich, ui_mainwindow.h, die die Objekte in meinem Hauptfenster erzeugt und erreicht diese Zeile:

[code oben ...]

pushButton = new QPushButton(centralWidget); 
    pushButton->setObjectName(QStringLiteral("pushButton")); 

    verticalLayout_2->addWidget(pushButton); 


    horizontalLayout->addLayout(verticalLayout_2); 

    GLwidget2 = new GLWidget(centralWidget);     /break point here - step into 

[Code unten ...]

Das alles läuft gut, bis der Konstruktor meines GLWidget genannt wird ... (glwidget.cpp)

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent = 0) : 
QOpenGLWidget(parent) 
{          //breakpoint here 
    alpha = 0; 
    beta = 0; 
    distance = defaultdistance; 
    QSurfaceFormat format; 
    format.setSamples(16); 
    format.setDepthBufferSize(24); 
    format.setVersion(3,0); 
    format.setProfile(QSurfaceFormat::CoreProfile); 
    this->setFormat(format); 
} 

Sobald ich über diesen Haltepunkt hinaus fortfahren wird der ASSERT-Fehler ausgelöst. Debuggen es führt mich zu diesem Platz in qopenglfunctions.h

[code oben ...]

inline GLuint QOpenGLFunctions::glCreateProgram() 
{ 
#ifdef QT_OPENGL_ES_2 
    GLuint result = ::glCreateProgram(); 
#else 
    Q_ASSERT(QOpenGLFunctions::isInitialized(d_ptr));  //this line 
    GLuint result = d_ptr->CreateProgram(); 
#endif 
    Q_OPENGL_FUNCTIONS_DEBUG 
    return result; 
} 

[Codde unten ...]

Der Wert von d_ptr zu diesem Zeitpunkt NULL ist, was ich denke, ist die Ursache des Fehlers. Muss ich einige OpenGL-Desktop-Versionen initialisieren, die für OpenGL ES-Versionen nicht benötigt werden?

Ich bin immer noch neu zu OpenGL, so würde jede Hilfe geschätzt werden!

Update Ich bin mir nicht sicher, was passiert ist, aber nach dem Zusammenführen meines aktualisierten Codes mit meinem älteren Arbeitscode hat alles funktioniert. Hoffentlich passiert das niemandem!

+0

Beachten Sie, dass OpenGL 3.0 keine Profile hat, und es ist eine sehr seltsame Version, nach der man fragen muss. Haben Sie eine OpenGL 3.0-fähige GPU und geeignete Treiber? – peppe

+0

Ok Peppe, welche Version von OpenGL schlage ich vor? Meine GPU ist zu 100% kompatibel mit OpenGL 4.3 und früher mit den neuesten Treibern, das sollte also kein Problem sein. Aus meiner Sicht ist es mir egal, welche Version von OpenGL ich benutze, solange ich den Tiefentest über glReadPixels verwenden kann. – scatatat

+0

Ändert sich etwas, wenn Sie nach 3.2 Core fragen? – peppe

Antwort

2

Sie müssen in Ihre GLWidget::initGL() Funktion hinzufügen.

Verwandte Themen