2013-07-02 12 views
5

To było 17 dni Staram się napisać prosty program w OpenGL przy użyciu QT, ale wszystkie tutoriale wyszukiwane w Google nie powiodły się. Skompilowałem mój QT 5.0.1 z użyciem pulpitu -opengl, używając msvc2010, aby ustawić domyślny OpenGL na pulpicie.Rozstrzyganie funkcji OpenGL za pomocą glew w QT

Przeczytałem samouczek Seana Harmera, ale jest zależne od QT w celu rozwiązania funkcji opengl.

Według niektórych osób nie jest możliwe użycie polecenia QT, ponieważ wbudowane biblioteki QT uniemożliwiają użycie glew z nagłówkami, ale według Seana Harmera HERE jest to możliwe (ale nie jest tam wyjaśnione) .

Nawet przy użyciu QGLWidget nie mogę używać rozszerzeń OpenGL.

Teraz chcę tylko użyć wszystkich funkcji OpenGL oddzielnie i wszystkich funkcji okienkowania z QT oddzielnie, tj. Bez interferencji w OpenGL przez QT.

Jeśli ktoś wytłumaczyć mi procedurę z prostym przykładzie trójkąta i za pomocą dowolnego rozszerzenia, I'l być tak wdzięczny ..

I'v używany glew biblioteki w moim projekcie i #included glew.h na samym początku mój program, ale gdy kompilowany daje błąd: glwidget.obj: -1: błąd: LNK2001: nierozwiązanych zewnętrznych symbolu imp_ _glewGenVertexArrays

mój plik .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 

Wyjście przez glewInfo: wersja GLEW 1.9.0 raportowania z PixelFormat 1 przebiegu na GeForce GT 540M/PCIe/SSE2 z NVIDIA Corporation OpenGL w wersji 4.3.0 jest obsługiwana

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

"Według niektórych osób nie można użyć polecenia QT" Wrong. Większość osób korzystających z OpenGL w aplikacjach Qt konfiguruje rozszerzenia z GLEW i wywołuje surowe funkcje OpenGL z wnętrza 'QGLWidgets'. Ale bez konkretnych komunikatów o błędach użyty plik '.pro', z którego korzystamy, itp., Nie możemy Ci pomóc. – cmannett85

+0

błędy "nierozwiązany zewnętrzny symbol imp__glew" pojawia się, gdy glew32s.lib jest dodany z oznaczeniem statycznym i znika, gdy glew32.lib zostanie dodany z dynamicznym oznaczeniem. Chociaż mój program kończy się nieoczekiwanie, po uruchomieniu w trybie debugowania problem jest w glDrawArrays ... – avg598

+0

Jeśli próbujesz uzyskać łącze statyczne w systemie Windows, musisz zdefiniować token "GLEW_STATIC". Prawdopodobnie nazywasz również 'glewInit()', gdy już masz poprawny kontekst. – cmannett85

Odpowiedz

14

Wszystkie problemy rozwiązane.

Pierwszy problem to: QT 5.0.1 nie obsługuje domyślnie OpenGL. Musisz skompilować go z pulpitu -opengl. Here to samouczek na temat kompilacji QT z vs2010. Albo możesz pobrać nowy build opengl z QT.

Drugi problem polegający na dodaniu bibliotek GPL do projektu. Jeśli dodasz glew32s.lib (statyczny), musisz dodać "#define GLEW_STATIC" przed "#include" Zalecane jest użycie glew32.lib (dynamic).

Trzecim problemem był błąd segmentu w niektórych funkcjach OpenGL, nawet jeśli twój GPU obsługuje wersję 4.3. GLEW uzyskuje informacje o obsługiwanych rozszerzeniach ze sterownika karty graficznej. Eksperymentalne lub przedpremierowe sterowniki mogą jednak nie zgłaszać każdego dostępnego rozszerzenia za pomocą standardowego mechanizmu, w którym to przypadku GLEW zgłosi go jako nieobsługiwany. Aby ominąć tę sytuację, globalny przełącznik glewExperimental można włączyć, ustawiając go na GL_TRUE przed wywołaniem glewInit(), co zapewnia, że ​​wszystkie rozszerzenia z ważnymi punktami wejścia będą odsłonięte.

Zajęło 18 dni, aby rozwiązać te problemy, zadowolony teraz może rozpocząć faktyczne programowanie.

4

następujący kod kompiluje tylko FINE na MSVC2008 wyrazić, qt 4.8.1 i wersja 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 

Zakładam, że sytuacja Qt 5 nie będzie się różnić.

Możesz pominąć paintGL QGLWidget i narysować, co chcesz, używając rozszerzeń. Nie mam w tym celu fragmentu kodu.

Sugestie:
1. Użyj prekompilowanych plików binarnych.
2. Może być sens używania dynamicznie połączonej wersji glew.
3. Kolejność dodawania nagłówka zawiadomienia.

According to some people

Ludzie mówią wiele rzeczy, nie musisz wierzyć w nie wszystkie.

Powiązane problemy