Seite 1 von 1

QT und OpenGL

Verfasst: 10. Oktober 2016 12:46
von procrash
Hallo,

ich versuche gerade mich in QT in Verbindung mit OpenGL einzuarbeiten.

Dabei habe ich beim QT Gui Example gespickt bei dem ein einfach rotierendes Dreieck gezeichnet wird.

Meine Applikation verwendet einerseits OpenGL in einem Widget, andererseits sollte es möglich sein per Doppelklick auf den Render Content in den Vollbildmodus zu wechseln.

Vorher hatte ich den ganze OpenGL Krempel noch mit glBegin und glEnd entwickelt aber dass ganze sollte man ja nicht verwenden also habe ich mal probiert mein Programm auf den neuesten OpenGL standard zu hieven.

Dieser Code hat vorher einwandfrei funktioniert, klicke ich jetzt allerdings auf den Render Content doppelt mit der Maus schmiert mir mein Programm ab

Code: Alles auswählen

template<class T>
void View3D<T>::mouseDoubleClickEvent(QMouseEvent *e) {
    if(isFullScreen())
    {
        setWindowFlags(Qt::Widget);
        showNormal();

    } else {
        setWindowFlags(Qt::Window);
        showFullScreen();
    }

Code: Alles auswählen

template<class T>
void View3D<T>::initializeGL()
{


    glClearColor(0,0,0,255);

    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_MULTISAMPLE);


    m_program = new QOpenGLShaderProgram(this);

    m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vertexShader.glsl");
    m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fragmentShader.glsl");

    m_program->link();
    m_posAttr = m_program->attributeLocation("posAttr");


    GLfloat vertices[] = {
       +0.0f, +1.0f, 0.0f,
       -1.0f, -1.0f,   0.0f,
       +1.0f, -1.0f,   0.0f
    };

    m_vbo.create();
    m_vbo.bind();
    m_vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
    m_vbo.allocate(vertices, sizeof(vertices));

    m_vao.create();
    m_vao.bind();
    glEnableVertexAttribArray(0);
    m_program->setAttributeBuffer(0,GL_FLOAT, 0, 3, 0);

    m_vbo.release();
    m_vao.release();
    m_program->release();
}

Code: Alles auswählen

template<class T>
void View3D<T>::paintGL()
{

    this->makeCurrent();

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    m_vao.bind();
    m_program->bind();

    glDrawArrays(GL_TRIANGLES, 0, 3);

    m_program->release();
    m_vao.release();
}

Das sind die Shader, wie gesagt ganz simpel:
fragmentShader:

Code: Alles auswählen

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
vertex Shader:

Code: Alles auswählen

attribute highp vec4 posAttr;
attribute lowp vec4 colAttr;
varying lowp vec4 col;
void main() {
   //col = colAttr;
   gl_Position = posAttr;
   gl_FrontColor = gl_Color;
}
Kann mir einer hier mal erklären was ich falsch mache?

Re: QT und OpenGL

Verfasst: 10. Oktober 2016 18:05
von Christian81
Und was sagt der Debugger dazu? Wie sieht der Backtrace aus?