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!
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
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
3.2 çekirdeği istediğinizde bir şey değişir mi? – peppe