2016-08-07 39 views
0

Ich verwende Qt 5.7.0 mit OpenGL 4.4 und ich versuche, etwas alten Code zu portieren, um mit Qt zu arbeiten. Soweit ich verstehe, ist Qt nicht seine eigene Art und Weise hat Shader Texturen zu handhaben, damit ich den folgenden Code bin mit, die in meinem GLEW, nicht-Qt-Projekt funktioniert gut:Qt5 - glTexStorage2D/glBindImageTextur nicht definiert?

float* data = new float[IMAGE_WIDTH * IMAGE_HEIGHT]; 
    for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT; ++i) 
     data[i] = 0.f; 

    GLuint tex[1]; 
    glGenTextures(1, tex); 
    glBindTexture(GL_TEXTURE_2D, tex[0]); 
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GL_RED, GL_FLOAT, data); 
    glBindImageTexture(0, tex[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F); 

    delete[] data; 

jedoch offenbar glTexStorage2D und glBindImageTexture sind undefiniert. Ich habe mir die Dokumentation angesehen und sie sollten existieren. Ich habe versucht #include ing QOpenGLFunctions_4_4_Core, QOpenGLFunctions_4_2_Core, QOpenGLTexture und QOpenGLFunctions aber keiner hat das Problem gelöst. Ich habe sogar in die Quelle der QOpenGLFunctions_4_4_Core sah:

inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) 
{ 
    d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height); 
} 

Selbst eine Instanz zu schaffen, gibt mir eine Fehlermeldung:

QOpenGLFunctions_4_4_Core gl; 
gl.glTexStorage2D((GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT); 

stürzt mit „Exception geworfen. Zugriffsverletzung lesen this-> d_4_2_Core war nullptr. "

Gibt es a) eine Möglichkeit, dieses Problem zu beheben; oder besser noch b) eine Qt-Möglichkeit, Bild laden/speichern?

+0

Gibt es einen Grund, warum Sie nicht normale OpenGL-Aufrufe verwenden können, anstatt Qt's Wrapper zu durchlaufen? –

+0

@NicolBolas Ich finde nur die Qt-Art, Dinge viel organisierter und einfacher zu handhaben zu machen, und ich würde lieber alles mit Qt machen als mit halbem Qt, halb regulärem OpenGL. – otah007

Antwort

0

Sie sollten einen Zeiger auf ein QOpenGLFunctions_4_4_Core Objekt über QOpenGLContext::versionFunctions() erhalten. Alternativ können Sie ein eigenes Objekt anlegen, müssen dann aber manuell die Funktionszeiger mit der Memberfunktion initializeOpenGLFunctions() laden, während der Kontext aktuell ist.

+0

Danke für die Antwort, aber durch den Versuch, den Kontext zu erhalten, fand ich, dass die Version, von der meine Basisfensterklasse erbte, OpenGL 3.1 war, weshalb die Funktionen nicht definiert waren; das Ändern auf 4.4 löste die Fehler. – otah007