`
schi
  • 浏览: 205154 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt5.1 And Modern OpenGL

阅读更多
I been learning modern opengl for a while. I really want to use Qt with opengl. But the Qt4.7.x's opengl was broken at windows.(I don't know if they fix it at Qt4.8.x. But the python binding works, both PyQt and PySide). So I have to waiting for Qt5. Qt5's opengl was redesigned, all new opengl class are in QtGui module now. It's quite different with Qt4. Here's example how to use OpenGL3.3 with Qt5.1. The new opengl in Qt5 has prefix QOpenGL*. I want to learn the pure opengl functions. So I will use gl* most of the time.

myglwindow.h
#ifndef MyGLWindow_H
#define MyGLWindow_H

#include <QWindow>
// for loading shaders and compile shaderprogram 
#include <QOpenGLShaderProgram>
// load opengl functions, if you use different version
// change the number to your version number
#include <QOpenGLFunctions_3_3_Core>

class MyGLWindow : public QWindow, protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT

public:
    MyGLWindow(QScreen *screen=0);
    ~MyGLWindow();

    // render function
    void render();
    // do all the initialize before render
    void initialize();

protected:
    void exposeEvent(QExposeEvent *event);
    void resizeEvent(QResizeEvent *event);

private:
    // opengl contex obj
    QOpenGLContext *m_context;
    // shader program obj
    QOpenGLShaderProgram *m_program;
    GLuint VAO;  // Vertex Array Object
    GLuint VBO;  // Vertex Buffer Object
};

#endif // MyGLWindow_H


myglwindow.cpp
#include “myglwindow.h"

MyGLWindow::MyGLWindow(QScreen *screen=0)
    : QWindow(screen)
{
    // Tell Qt this window is use for OpenGL
    setSurfaceType(OpenGLSurface);

    // setup opengl context's format
    // like opengl's version and profile
    QSurfaceFormat format;
    format.setMajorVersion(3);
    format.setMinorVersion(3);
    format.setProfile(QSurfaceFormat::CoreProfile);
    setFormat(format);

    // make sure the format was use by the window
    // you don't need to call it directly, as it 
    // will be implicitly called by show()
    create();

    // create opengl context
    m_context = new QOpenGLContext;
    m_context->setFormat(format);
    m_context->create();
    // tell the window to use it
    m_context->makeCurrent(this);

    // load opengl functions
    initializeOpenGLFunctions();

    // 
    initialize();
}

MyGLWindow::~MyGLWindow()
{
}

void MyGLWindow::render()
{
    // we need to make sure the context is current
    m_context->makeCurrent(this);

    // clear screen color to black 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // active shader program
    glUseProgram(m_program->programId());

    // bind Vertex Array Object
    glBindVertexArray(VAO);

    // draw triangle
    glDrawArrays(GL_TRIANGLES, 0, 3);

    // bind Vertex Array to 0
    glBindVertexArray(0);
    glUseProgram(0);

    m_context->swapBuffers(this);
}

void MyGLWindow::initialize()
{
    // create shader program
    m_program = new QOpenGLShaderProgram(m_context);
    // load vertex shader
    m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "vertexColors.vert");
    // load fragment shader
    m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "vertexColors.frag");
    m_program->link(); // compile and link shader program

    const float vertexData[] = {
        // x    y     z    w
        0.0f, 0.5f, 0.0f, 1.0f, 
        0.5f, -0.366f, 0.0f, 1.0f, 
        -0.5f, -0.366f, 0.0f, 1.0f, 

        // R    G     B    A
        1.0f, 0.0f, 0.0f, 1.0f, 
        0.0f, 1.0f, 0.0f, 1.0f, 
        0.0f, 0.0f, 1.0f, 1.0f, 
    };

    // create Vertex Buffer Object
    glGenBuffers(1, &VBO);
    // bind it to the GL_ARRAY_BUFFER
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // copy data to GPU
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    // bind the GL_ARRAY_BUFFER to 0
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    // create Vertex Array Object
    glGenVertexArrays(1, &VAO);
    // bind it
    glBindVertexArray(VAO);
    
    // bind VBO to GL_ARRAY_BUFFER
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // enable vertex array
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    // setup the data format
    // this will tell VAO that the vertex array 0 is something like
    // [[0.0f, 0.5f, 0.0f, 1.0f], [0.5f, -0.366f, 0.0f, 1.0f,], [-0.5f, -0.366f, 0.0f, 1.0f]]
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    // the last parameter is a pointer
    // specifies the offset of the first component of the vertexData[]
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48);

    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void MyGLWindow::exposeEvent(QExposeEvent *event)
{
    if(isExpose())
        render();
}

void MyGLWindow::resizeEvent(QResizeEvent *event)
{
    // tell opengl to resize
    glViewport(0, 0, width(), height());
    if(isExpose())
        render();
}


main.cpp
#include <QApplication>
#include "myglwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyGLWindow w;
    w.resize(640, 480);
    w.show();
    return a.exec();
}



vertex shader
vertexColors.vert
#version 330

layout(location=0) in vec4 position;
layout(location=1) int vec4 color;

out vec4 theColor;

void main()
{
    gl_Position = position;
    theColor = color;
}


Fragment shader
vertexColors.frag
#version 330

in vec4 theColor;

out vec4 outColor;

void main()
{
    outColor = theColor;
}
分享到:
评论

相关推荐

    用Qt和OpenGL制作的颜色立方体例子(演示程序+源代码)

    此资源包含了演示程序和源代码。 ---------------------------- Qt5相比Qt4有了很大的改变,对OpenGL这一部分支持的力度加大了。...早在Qt5.1还没有发布的时候,国外就有高手发布了Qt5.1对OpenGL支持的相关特性。

    QT5.1 FOR ANDROID 安装配置

    在安装 QT5.1 for Android 之前,需要安装多个必要的安装包,包括 Android 的 SDK、NDK、Apache 的 Ant、OpenJDK 以及 OpenGL 库。 1. 安装 Android 的 SDK 首先,需要下载和安装 Android 的 SDK。可以从官方网站...

    用Qt和OpenGL制作的颜色立方体例子(演示程序)

    此资源是演示程序,大家可以免积分下载。源代码参见我的其它资源。 ---------------------------------------- Qt5相比Qt4有了很大的...早在Qt5.1还没有发布的时候,国外就有高手发布了Qt5.1对OpenGL支持的相关特性。

    qt5.1类关系图

    QT5.1是一个重要的版本,它是Qt框架的一部分,Qt是一个跨平台的应用程序开发框架,广泛用于创建GUI(图形用户界面)应用程序。这个框架以其丰富的类库、强大的功能和高效的性能而受到开发者的青睐。在QT5.1中,类的...

    QT5.1类图之间的抽象关系

    QT5.1是Qt库的一个重要版本,它包含了大量的C++类,这些类构成了一个强大的框架,用于构建图形用户界面(GUI)和其他跨平台应用程序。这张图表提供了对Qt5.1中类之间关系的直观理解,这对于深入学习和开发基于Qt的...

    媒体播放器--qt5.1设计

    《媒体播放器--qt5.1设计》 在IT领域,媒体播放器是不可或缺的应用程序,它们能够处理各种音频和视频格式,为用户提供便捷的多媒体体验。本项目以qt5.1版本为核心,设计出一个界面简洁、功能实用的媒体播放器。qt...

    Qt 5.1 ctrl ctrl 启动

    在"Qt 5.1 ctrl ctrl 启动"这个主题中,我们聚焦的是如何利用Qt 5.1版本创建自定义全局快捷键,特别是以"Ctrl+Ctrl"为组合键的快捷方式。这种功能对于提高用户交互性和效率至关重要,尤其在桌面应用中,快捷键可以...

    Qt5.1_ClassDiagram

    Qt5类关系图,基于Qt5.1版本,对于系统学习Qt5很有帮助。

    QT5.1联接MySQL5.5.28驱动

    QT5.1连接MySQL5.5.28驱动是一个关键的技术环节,特别是在开发跨平台的数据库应用程序时。QT,由Trolltech开发并由The Qt Company维护,是一个强大的C++框架,广泛用于创建图形用户界面和其他软件应用。而MySQL则是...

    Qt5.1类继承关系图.png.zip

    Qt5.1类继承关系图,免费资源 。

    qt5.1的mysql驱动程序(win32)

    在标题中提到的"qt5.1的mysql驱动程序(win32)",意味着我们要在运行Windows 32位操作系统的环境中,安装和配置Qt 5.1版本的MySQL数据库驱动。这个驱动程序是为Qt的SQL模块设计的,允许开发者使用Qt的QSqlDatabase...

    VS2012中QT5.1自定plugin及动态加载plugin

    在本文中,我们将深入探讨如何在Visual Studio 2012 (VS2012)环境中,使用QT 5.1框架开发自定义插件,并实现动态加载这些插件。这个过程涉及到的主要知识点包括QT插件机制、插件接口设计、VS2012与QT的集成以及动态...

    qt5.1实现的异形按钮(适应图片的形状)

    本示例基于Qt5.1版本,展示了如何利用Qt的功能来实现一个按钮,其形状能根据所绑定图片的轮廓进行自适应,从而达到更加吸引人的视觉效果。 首先,我们要了解Qt中的`QWidget`类,它是所有用户界面对象的基础,包括`...

    OpenGL+qt抗锯齿OpenGL+qt抗锯齿

    OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿OpenGL+qt抗锯齿...

    opengl+qt实现鼠标选中模型

    opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型...

    Qt+opengl加载各种类型的3D模型,.glb .obj 等;Qt+opengl加载各种类型的3D模型,.glb .obj

    Qt+opengl加载各种类型的3D模型,.glb .obj 等;Qt+opengl加载各种类型的3D模型,.glb .obj 等;Qt+opengl加载各种类型的3D模型,.glb .obj 等;Qt+opengl加载各种类型的3D模型,.glb .obj 等;Qt+opengl加载各种...

    Qt+ffmpeg+opengl实现一款精美的播放器,Qt+ffmpeg+opengl实现一款精美的播放器

    Qt+ffmpeg+opengl实现一款精美的播放器。 Qt+ffmpeg+opengl实现一款精美的播放器。 Qt+ffmpeg+opengl实现一款精美的播放器。 Qt+ffmpeg+opengl实现一款精美的播放器。 Qt+ffmpeg+opengl实现一款精美的播放器。 完整...

    Qt5.1类继承关系图

    从提供的文件信息中,我们可以提炼出关于Qt5.1类继承关系图的详细知识点,这些知识涉及到Qt的模型视图框架,模型-视图-控制器(MVC)设计模式,以及如何在Qt中使用模型和视图。 首先,Qt的模型视图框架是一组用于...

    Qt5版Nehe OpenGL教程1-5

    【Qt5版Nehe OpenGL教程1-5】是一系列针对初学者的教程,旨在通过Qt5框架教授OpenGL图形编程的基本概念和技术。OpenGL是一种强大的跨平台图形库,用于渲染2D和3D图形,而Qt5则是一个流行的开发框架,支持多种操作...

Global site tag (gtag.js) - Google Analytics