最近、私の最初の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をまだ新しくしていますので、どんな助力にも感謝します!
更新私は何が起こっているのか分かりませんが、私の古いコードと更新されたコードをマージした後、すべてうまくいきました。うまくいけば、これは誰にも起こらない!
OpenGL 3.0にはプロファイルはなく、尋ねるのは非常に奇妙なバージョンです。あなたはOpenGL 3.0対応GPUと適切なドライバを持っていますか? – peppe
Ok Peppe、私が使ってみたいOpenGLのバージョンは?私のGPUはOpenGL 4.3以前と最新のドライバで100%互換性があるので、問題ではないはずです。私の見解では、glReadPixelsを介して深度テストを使用できる限り、OpenGLのどのバージョンを使用するのか特に気にしません。 – scatatat
3.2コアを求めても何か変わりますか? – peppe