2013-07-02 9 views
5

Sono passati 17 giorni Non riesco a scrivere un semplice programma in OpenGL utilizzando QT, ma tutti i tutorial cercati su Google non sono riusciti. Ho compilato il mio QT 5.0.1 con -opengl desktop usando msvc2010 per rendere predefinito il desktop opengl.Risoluzione delle funzioni OpenGL utilizzando glew in QT

Ho letto il tutorial di Sean Harmer, ma è dipeso da QT per risolvere le funzioni opengl.

Secondo alcune persone, non è possibile utilizzare glew in QT, poiché le librerie incorporate di QT impediscono a glew di includere le intestazioni, ma secondo Sean Harmer HERE, è possibile (ma non viene spiegato come) .

Anche utilizzando QGLWidget non sono in grado di utilizzare le estensioni OpenGL.

Ora tutto quello che voglio è utilizzare tutte le funzioni OpenGL separate e tutte le funzioni di windowing da QT separate, cioè nessuna interferenza in OpenGL da parte di QT.

Se qualcuno mi spiega la procedura con la semplice esempio triangolo e con qualsiasi estensione, I'l essere così grato ..

I'v utilizzato biblioteca Glew nel mio progetto e glew.h #included in proprio all'inizio del il mio programma, ma quando compilato dà errore: glwidget.obj: -1: errore: LNK2001: simbolo esterno non risolto imp_ _glewGenVertexArrays

il mio file .pro

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 

Uscita dal glewInfo: versione 1.9.0 GLEW funzionalità di reporting di PixelFormat 1 in esecuzione su un GeForce GT 540M/PCIe/SSE2 da parte di NVIDIA Corporation OpenGL versione 4.3.0 è supportato

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); 
} 
+0

"Secondo alcune persone, non è possibile utilizzare glew in QT" Sbagliato. La maggior parte delle persone che usano OpenGL nelle app Qt configura le estensioni con GLEW e chiama le funzioni OpenGL raw da 'QGLWidgets'. Ma senza specifici messaggi di errore, il file '.pro' che hai usato, ecc. Non possiamo aiutarti. – cmannett85

+0

errori "simbolo esterno non risolto imp__glew" arriva quando glew32s.lib viene aggiunto con marcatura statica e scompaiono quando glew32.lib viene aggiunto con il contrassegno dinamico. Anche se il mio programma termina in modo imprevisto, quando viene eseguito in modalità di debug, il problema si verifica in glDrawArrays ... – avg598

+0

Se si sta tentando di eseguire il collegamento statico su Windows, è necessario definire il token 'GLEW_STATIC'. Presumibilmente stai chiamando 'glewInit()' una volta che hai un contesto valido. – cmannett85

risposta

14

Tutti i problemi risolti ora.

Primo problema: QT 5.0.1 non supporta opengl per impostazione predefinita. Devi compilarlo con -opengl desktop. Here è un tutorial su come compilare QT con vs2010. Oppure puoi scaricare il nuovo build opengl da QT.

Secondo problema nell'aggiunta di librerie glew per la proiezione. Se aggiungi glew32s.lib (statico), devi aggiungere "#define GLEW_STATIC" prima di "#include" Si consiglia di utilizzare glew32.lib (dinamico).

Il terzo problema era l'errore di segmento su alcune funzioni opengl anche se la GPU supporta la versione 4.3. GLEW ottiene informazioni sulle estensioni supportate dal driver grafico. I driver sperimentali o pre-release, tuttavia, potrebbero non segnalare tutte le estensioni disponibili tramite il meccanismo standard, nel qual caso GLEW segnalerà che non è supportato. Per aggirare questa situazione, è possibile attivare l'interruttore globale glewExperimental impostandolo su GL_TRUE prima di chiamare glewInit(), in modo che vengano esposte tutte le estensioni con punti di ingresso validi.

Ci sono voluti 18 giorni per risolvere questi problemi, felice ora può iniziare la programmazione vera e propria.

4

Seguendo codice viene compilato solo bene su MSVC2008 esprimere, qt 4.8.1 e la versione Glew 1.7.0

main.cpp:

#include <GL/glew.h> 
#include <QApplication> 
#include <QGLWidget> 

int main(int argc, char** argv){ 
    glewInit();//<<-- glew function 
    QApplication app(argc, argv); 
    QGLWidget widget; 

    GLuint arr; 
    glGenVertexArrays(1, &arr);//<--no linker error (added just for testing, most likely won't gen arrays) 

    widget.show(); 
    return app.exec(); 
} 

gltest.pro:

TEMPLATE = app 
TARGET = 
DEPENDPATH += . 
INCLUDEPATH += . d:/c++/libs/include 
LIBS += -L"d:/c++/libs/lib" -lglew32 

CONFIG += console 
QT += opengl 

# Input 
SOURCES += main.cpp 

Suppongo che con Qt 5 la situazione non sarà diversa.

Sentitevi liberi di ignorare il paintGL di QGLWidget e disegnare quello che volete usando le estensioni. Non ho uno snippet di codice nelle vicinanze per quello.

Suggerimenti:
1. Utilizzare i binari precompilati.
2. Potrebbe essere opportuno utilizzare la versione di glew con collegamento dinamico.
3. Avviso ordine di inclusione intestazione.

According to some people

Le persone dicono molte cose, non è necessario crederci tutte.