Auflösen von OpenGL-Funktionen mit glew in QT
Seine seit 17 Tagen ich habe Mühe zu schreiben, ein einfaches Programm in OpenGL mit QT, aber alle tutorials in Google gesucht werden konnte.
I ' V zusammengestellt meine QT 5.0.1 mit -opengl desktop mit msvc2010 zu machen desktop opengl-Standard.
I ' V Lesen Sie das tutorial von Sean Harmer, aber es ist angewiesen auf QT zu beheben opengl-Funktionen.
Laut einigen Menschen ist es nicht möglich, glew in QT, QT-built-in Bibliotheken verhindern, dass glew aus, einschließlich Ihrer überschriften, aber nach Sean Harmer HIER , es ist möglich (aber es ist nicht erklärt, wie).
Sogar mit QGLWidget ich bin nicht in der Lage, OpenGL-Erweiterungen.
Alles was ich jetzt wollen, ist auf alle OpenGL-Funktionen getrennt und alle Window-Funktionen von QT trennen, d.h. keine Einmischung in OpenGL QT.
Wenn jemand mir erklären das Verfahren mit einfachen Dreieck Beispiel und mit jeder Erweiterung, I ' L so dankbar..
I ' V verwendet glew-Bibliothek in mein Projekt und #enthalten, glew.h im Anfang von meinem Programm, aber beim kompilieren gibt es Fehler:
glwidget.obj:-1: Fehler: LNK2001: nicht aufgelöstes externes symbol imp__glewGenVertexArrays
Meine .pro Datei
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Trial
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
glwidget.cpp
HEADERS += mainwindow.h \
glwidget.h
FORMS += mainwindow.ui
RESOURCES += \
resources.qrc
win32: LIBS += -L$$PWD/../../../../../OpenGL/glew-1.9.0/lib/ -lglew32s
INCLUDEPATH += $$PWD/../../../../../OpenGL/glew-1.9.0/include
DEPENDPATH += $$PWD/../../../../../OpenGL/glew-1.9.0/include
win32: PRE_TARGETDEPS += $$PWD/../../../../../OpenGL/glew-1.9.0/lib/glew32s.lib
Ausgabe von glewInfo :
GLEW version 1.9.0
Reporting-Funktionen von pixelformat 1
Es läuft auf einer GeForce GT 540M/PCIe/SSE2 von NVIDIA Corporation
OpenGL-version 4.3.0 unterstützt wird
void GLWidget::initializeGL()
{
GLenum err = glewInit();
if(err != GLEW_OK)
{
printf("%s",glewGetErrorString(err));
}
glEnable(GL_DEPTH_TEST);
qglClearColor(QColor(Qt::red));
shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
shaderProgram.link();
shaderProgram.bind();
const GLubyte *oglVersion = glGetString(GL_VERSION);
printf( "%s\n",oglVersion );
GLfloat vertices[3][3] ={{ -0.5, -0.5, -1 },
{ 0, 0.5, -1},
{ 0.5, -0.5, -1}};
vertexArray.create();
vertexArray.setUsagePattern(QOpenGLBuffer::StaticDraw);
vertexArray.allocate( vertices, 3 * 3 * sizeof( GLfloat ) );
vertexArray.bind();
shaderProgram.setAttributeBuffer( "vVertex", GL_FLOAT, 0, 3 );
shaderProgram.enableAttributeArray( "vVertex" );
GLuint arr[5];
glGenBuffers(5,arr);
}
QGLWidgets
. Aber ohne konkrete Fehlermeldungen, die .pro
Datei, die Sie verwendet haben, etc. wir können Ihnen nicht helfen.Fehler "nicht aufgelöstes externes symbol imp__glew" kommt, wenn glew32s.lib Hinzugefügt, mit static gekennzeichnet, und Sie verschwinden, wenn glew32.lib Hinzugefügt wird, mit dynamisch gekennzeichnet. Obwohl mein Programm wird unerwartet beendet, wenn Sie lief in den debug-Modus, das problem ist bei glDrawArrays...
Wenn Sie versuchen, eine statische link auf Windows, müssen Sie definieren, die
GLEW_STATIC
token. Vermutlich sind Sie auch den Aufruf glewInit()
sobald Sie gültigen Kontext.Ja Iv glewInit() in initialiseGL(). Als Sie sagte, ich habe GLEW_STATIC vor #inklusive glew.h, aber es gibt Warnhinweise: :-1: Warnung: LNK4098: defaultlib 'LIBCMT' Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden glew32s.lib(glew.obj):-1: Warnung: LNK4099: PDB 'vc100.pdb " wurde nicht mit gefunden 'glew32s.lib(glew.obj)' oder 'D:\Dexter\Softwares\Programming stuff\QT Projekte\Trial-bauen-Desktop_Qt_5_0_1_MSVC2010_32bit-Debug\debug\vc100.pdb'; Verknüpfung von Objekt, als ob keine Debuginformationen
Nur um sicher zu gehen, welche OpenGL-version hat deine GPU-Unterstützung (zurückgegeben durch
glewinfo
)? Auch, veröffentlichen Sie Ihre initializeGL()
Methode.InformationsquelleAutor avg598 | 2013-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Probleme gelöst jetzt.
Erste problem war : QT 5.0.1 opengl nicht unterstützt standardmäßig.
Sie haben, um es zu kompilieren mit -opengl desktop.
Hier ist Anleitung zum kompilieren von QT mit vs2010.
Oder Sie können download der neuen opengl-build von QT.
Zweite problem beim hinzufügen von glew Bibliotheken-Projekt.
Wenn Sie hinzufügen glew32s.lib (statisch), dann müssen Sie hinzufügen "#define GLEW_STATIC" vor "#include"
Es wird empfohlen, um glew32.lib (dynamisch).
Dritte problem war-segment-Fehler auf einige opengl-Funktionen, auch wenn deine GPU unterstützt die version 4.3.
GLEW erhält Informationen über die unterstützten Erweiterungen aus der Grafik-Treiber. Experimentelle oder pre-release-Treibern, die aber möglicherweise nicht Bericht jeder verfügbaren Erweiterung über den standard-Mechanismus, in dem Fall GLEW-Bericht wird es nicht unterstützt. Zur Umgehung dieser situation, die glewExperimental globaler Schalter, der eingeschaltet werden kann, indem Sie es auf GL_TRUE vor dem Aufruf glewInit(), die dafür sorgt, dass alle Erweiterungen mit Gültiger Eintrag Punkte ausgesetzt werden.
Dauerte 18 Tage, um diese Probleme zu lösen, sind froh, dass nun die eigentliche Programmierung kann beginnen.
InformationsquelleAutor avg598
Folgende code kompiliert werden, nur FEIN auf MSVC2008 express, qt 4.8.1 und glew version 1.7.0
main.cpp:
gltest.pro:
Ich davon ausgehen, dass mit Qt 5 situation wird nicht anders sein.
Fühlen Sie sich frei, zu überschreiben QGLWidget ist paintGL und zeichnen, was Sie wollen, die Verwendung von Erweiterungen. Ich habe nicht einen code-snippet in der Nähe.
Vorschläge:
1. Verwenden Sie vorkompilierte binaries.
2. Es könnte Sinn machen, verwenden Sie die dynamisch verknüpfte version von glew.
3. Hinweis header-Aufnahme um.
Menschen sagen viele Dinge, die Sie nicht brauchen, um glauben Sie alle von Ihnen.
InformationsquelleAutor SigTerm