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