Using-QOpenGLFunctions-and-QOpenGLContext

From Qt Wiki
Jump to: navigation, search
This simple examle demonstrates to using QOpenGLFunctions and QOpenGLContext. OpenGL 3.3 Core Profile support require for compile and run this demo.According to recent Qt 5.2.0 //////////// FOR BUILD/////////// //g++ -fPIC -I/usr/include/qt -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore main.cpp -lQt5Gui -lQt5Core -lGL -lpthread
  1. include <QGuiApplication>
  2. include <QOpenGLContext>
  3. include <QWindow>
  4. include <QOpenGLFunctions_3_3_Core>
  5. include <stdio.h>
class OpenGLWindow : public QWindow, protected QOpenGLFunctions_3_3_Core{ public: explicit OpenGLWindow(); ~OpenGLWindow(); virtual void render(); bool isWindowInitialized; void exposeEvent(QExposeEvent *event); bool event(QEvent event); private: QOpenGLContext ctx; QSurfaceFormat* fmt; bool isGLInitialized; GLuint VertexArrayID; GLuint buffer1; GLuint ProgramID; }; bool OpenGLWindow::event(QEvent *event) { switch (event->type()) { case QEvent::UpdateRequest: render(); return true; case QEvent::Close: glDisableVertexAttribArray(0); glDeleteBuffers(1, &buffer1); glDeleteVertexArrays(1, &VertexArrayID); glDeleteProgram(ProgramID); return QWindow::event(event); case QEvent::Resize: if(isWindowInitialized && isGLInitialized)glViewport(0,0,width(),height()); return QWindow::event(event); default: return QWindow::event(event); } } void OpenGLWindow::exposeEvent(QExposeEvent *event) { Q_UNUSED(event); if (isExposed())render(); } OpenGLWindow::OpenGLWindow() :ctx(new QOpenGLContext) ,fmt(new QSurfaceFormat) ,isGLInitialized(0) { setSurfaceType(OpenGLSurface); fmt->setRenderableType(QSurfaceFormat::OpenGL); fmt->setVersion(3,3); resize(640,480); fmt->setProfile(QSurfaceFormat::CoreProfile); setFormat(*fmt); ctx->setFormat(fmt); ctx->create(); } OpenGLWindow::~OpenGLWindow() {} void OpenGLWindow::render(){ if(File:IsWindowInitializedisExposed())return; if(!isGLInitialized){ ctx->makeCurrent(this); initializeOpenGLFunctions(); GLuint vsID = glCreateShader(GL_VERTEX_SHADER); GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER); const char vs="#version 330 coren layout(location = 0) in vec3 vertexPosition_modelspace;void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0;}"; const char* fs="#version 330 coren out vec3 color; void main(){ color = vec3(1,0,0);}"; glShaderSource(vsID, 1, &vs , NULL); glCompileShader(vsID); GLint isCompiled = 0; glGetShaderiv(vsID, GL_COMPILE_STATUS, &isCompiled); if(isCompiled == GL_FALSE){ GLint maxLength = 0; glGetShaderiv(vsID, GL_INFO_LOG_LENGTH, &maxLength); char info[maxLength]; glGetShaderInfoLog(vsID, maxLength, &maxLength, info); printf("%s",info);} glShaderSource(fsID, 1, &fs , NULL); glCompileShader(fsID); glGetShaderiv(fsID, GL_COMPILE_STATUS, &isCompiled); if(isCompiled == GL_FALSE){ GLint maxLength = 0; glGetShaderiv(fsID, GL_INFO_LOG_LENGTH, &maxLength); char info[maxLength]; glGetShaderInfoLog(fsID, maxLength, &maxLength, info); printf("%s",info);} GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, vsID); glAttachShader(ProgramID, fsID); glLinkProgram(ProgramID); glDeleteShader(vsID); glDeleteShader(fsID); static const GLfloat data1[] = { –1.0f, –1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); glGenBuffers(1, &buffer1); glBindBuffer(GL_ARRAY_BUFFER,buffer1); glBufferData(GL_ARRAY_BUFFER, sizeof(data1),data1, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0 ,3 ,GL_FLOAT ,GL_FALSE,0 ,(void*)0 ); glClearColor(0.0f, 0.0f, 0.4f,1.0f); glUseProgram(ProgramID); glViewport(0,0,width(),height()); isGLInitialized=true; } if(isExposed()){ glClear( GL_COLOR_BUFFER_BIT ); glDrawArrays(GL_TRIANGLES, 0, 3); ctx->swapBuffers(this); } } int main(int argc, char *argv) { QGuiApplication app(argc, argv); OpenGLWindow win = new OpenGLWindow(); win->show(); win->isWindowInitialized=true; return app.exec(); }
This demo tested on kernel 3.12.8 mesa 10.0.2 xorg 1.15 and intel ivy bridge graphics.Worked perfectly.