2016-03-26 40 views
0

最近、私の最初のOpenGLプログラムでキューブをレンダリングしました。これを他の基本機能(回転、ズーム、パン、マウスの頂点選択)に拡張しました。しかし、gl_depth_componentでglReadPixelsを使用して、表示可能な頂点のみのマウス選択を有効にできないため、プログラムでOpenGL ES x.xのいくつかのバージョンを使用していたと思います。QTエラーのあるOpenGL:ASSERT: "QOpenGLFunctions :: isInitialized(d_ptr)"。 OpenGLコンテキストを作成できません

これを修正するために、メインプログラムのOpenGLバージョン3.0にデフォルトのサーフェスフォーマットを手動で指定するように私の古いプログラムを修正しましたが、GLWidgetのインスタンスを作成しようとすると次のエラーがスローされます。

ASSERT: "QOpenGLFunctions :: isInitialized(d_ptr)"

私の主な機能(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(); 
} 

このブレークポイントに足を踏み入れることは、私のメイン・ウィンドウコンストラクタ(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())); 
} 

このブレークポイントに足を踏み入れる私のメインウィンドウ内のオブジェクトを作成し、このラインに到達し、ui_mainwindow.hする私をリード:

[上記のコード...]

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 

[以下のコード...]

私GLWidgetのコンストラクタが呼び出されるまで、このすべてが正常に動作... (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); 
} 

このブレークポイントを過ぎるとすぐに、ASSERTエラーがスローされます。 、デバッグそれはqopenglfunctions.h

でこの場所に私をリードし、[上記のコード...]

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 ...]

d_ptrの値がNULLであります私はそれがエラーの原因だと思います。 OpenGL ES版では不要なデスクトップOpenGLバージョンの初期化を行う必要がありますか?

私はOpenGLをまだ新しくしていますので、どんな助力にも感謝します!

更新私は何が起こっているのか分かりませんが、私の古いコードと更新されたコードをマージした後、すべてうまくいきました。うまくいけば、これは誰にも起こらない!

+0

OpenGL 3.0にはプロファイルはなく、尋ねるのは非常に奇妙なバージョンです。あなたはOpenGL 3.0対応GPUと適切なドライバを持っていますか? – peppe

+0

Ok Peppe、私が使ってみたいOpenGLのバージョンは?私のGPUはOpenGL 4.3以前と最新のドライバで100%互換性があるので、問題ではないはずです。私の見解では、glReadPixelsを介して深度テストを使用できる限り、OpenGLのどのバージョンを使用するのか特に気にしません。 – scatatat

+0

3.2コアを求めても何か変わりますか? – peppe

答えて

2

あなたのGLWidget::initGL()関数にinitializeOpenGLFunctions();を追加する必要があります。

関連する問題