2016-03-26 31 views
0

Yakın zamanda, bazı diğer temel özellikleri (döndürme, yakınlaştırma, yatay kaydırma, farenin köşe seçimi) içerecek şekilde genişletilen bir küp oluşturduğum ilk OpenGL programımı yaptım. Ancak, programın OpenGL ES x.x'in bir sürümünü kullandığını düşünüyorum çünkü gl_depth_component ile glReadPixels'i kullanamadım, sadece görünür köşelerin fare seçimini etkinleştirdim.OpenGL: ASSERT: "QOpenGLFunctions :: isInitialized (d_ptr)". OpenGL bağlamı oluşturulamıyor

Bunu düzeltmek için eski programımı ana işlevimdeki varsayılan yüzey biçimini OpenGL sürüm 3.0'e manuel olarak belirtmek üzere değiştirdim, ancak şimdi GLWidget örneğini oluşturmaya çalışırken program şu hatayı atar.

ASSERT: "QOpenGLFunctions :: isInitialized (d_ptr)"

Benim ana işlevi (main.cpp): Bu kesme içine Stepping

#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(); 
} 

benim MainWindow yapıcısı (mainwindow.cpp) götürüyor :

#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())); 
} 

bu kesme içine Stepping benim MainWindow nesneler oluşturur ve bu çizgiyi ulaştığı, ui_mainwindow.h beni götürüyor:

[yukarıdaki kodu ...]

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 

[aşağıdaki kod ...]

benim GLWidget yapıcısı denir kadar bu tüm iyi çalışır ... (glwidget.cpp)

Bu kesme noktasını geçmeye devam ettiğimde, ASSERT hatası atılır.

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; 
} 

[... Yukarıdaki kod] o

qopenglfunctions.h içinde bu yere götürüyor ayıklama [codde aşağıda ...]

şu anda d_ptr değeri NULL ise

, sanırım hatanın sebebi. OpenGL ES sürümleri için gerekli olmayan bazı masaüstü OpenGL sürümlerinin başlatılması gerekiyor mu?

Hala OpenGL için yeniyim, bu yüzden herhangi bir yardım memnuniyetle karşılanacaktır!

Güncelleme Neler olduğunu bilmiyordum, ancak güncellenmiş kodumu eski çalışma kodumla birleştirdikten sonra her şey iyi çalıştı. Umarım bu hiç kimseye olur!

+0

OpenGL 3.0'ın profillere sahip olmadığını ve sormak için çok tuhaf bir sürüm olduğunu unutmayın. OpenGL 3.0 uyumlu bir GPU'nuz ve uygun sürücüleriniz var mı? – peppe

+0

Ok Peppe, hangi OpenGL sürümünü kullanmaya çalıştığımı önerirsiniz? GPU'm OpenGL 4.3 ile% 100 uyumluluğa ve en yeni sürücülerle daha erken bir süreye sahip. Bu da sorun olmamalı. Benim bakış açımdan, özellikle OpenGL'ın hangi sürümünün glReadPixels ile derinlik testini kullanabildiğim sürece kullanıldığını düşünmüyorum. – scatatat

+0

3.2 çekirdeği istediğinizde bir şey değişir mi? – peppe

cevap

2

initializeOpenGLFunctions(); öğünüzü GLWidget::initGL() işlevinize eklemeniz gerekir.