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;
}
分享到:
相关推荐
此资源包含了演示程序和源代码。 ---------------------------- Qt5相比Qt4有了很大的改变,对OpenGL这一部分支持的力度加大了。...早在Qt5.1还没有发布的时候,国外就有高手发布了Qt5.1对OpenGL支持的相关特性。
在安装 QT5.1 for Android 之前,需要安装多个必要的安装包,包括 Android 的 SDK、NDK、Apache 的 Ant、OpenJDK 以及 OpenGL 库。 1. 安装 Android 的 SDK 首先,需要下载和安装 Android 的 SDK。可以从官方网站...
此资源是演示程序,大家可以免积分下载。源代码参见我的其它资源。 ---------------------------------------- Qt5相比Qt4有了很大的...早在Qt5.1还没有发布的时候,国外就有高手发布了Qt5.1对OpenGL支持的相关特性。
QT5.1是一个重要的版本,它是Qt框架的一部分,Qt是一个跨平台的应用程序开发框架,广泛用于创建GUI(图形用户界面)应用程序。这个框架以其丰富的类库、强大的功能和高效的性能而受到开发者的青睐。在QT5.1中,类的...
QT5.1是Qt库的一个重要版本,它包含了大量的C++类,这些类构成了一个强大的框架,用于构建图形用户界面(GUI)和其他跨平台应用程序。这张图表提供了对Qt5.1中类之间关系的直观理解,这对于深入学习和开发基于Qt的...
《媒体播放器--qt5.1设计》 在IT领域,媒体播放器是不可或缺的应用程序,它们能够处理各种音频和视频格式,为用户提供便捷的多媒体体验。本项目以qt5.1版本为核心,设计出一个界面简洁、功能实用的媒体播放器。qt...
在"Qt 5.1 ctrl ctrl 启动"这个主题中,我们聚焦的是如何利用Qt 5.1版本创建自定义全局快捷键,特别是以"Ctrl+Ctrl"为组合键的快捷方式。这种功能对于提高用户交互性和效率至关重要,尤其在桌面应用中,快捷键可以...
Qt5类关系图,基于Qt5.1版本,对于系统学习Qt5很有帮助。
QT5.1连接MySQL5.5.28驱动是一个关键的技术环节,特别是在开发跨平台的数据库应用程序时。QT,由Trolltech开发并由The Qt Company维护,是一个强大的C++框架,广泛用于创建图形用户界面和其他软件应用。而MySQL则是...
Qt5.1类继承关系图,免费资源 。
在标题中提到的"qt5.1的mysql驱动程序(win32)",意味着我们要在运行Windows 32位操作系统的环境中,安装和配置Qt 5.1版本的MySQL数据库驱动。这个驱动程序是为Qt的SQL模块设计的,允许开发者使用Qt的QSqlDatabase...
在本文中,我们将深入探讨如何在Visual Studio 2012 (VS2012)环境中,使用QT 5.1框架开发自定义插件,并实现动态加载这些插件。这个过程涉及到的主要知识点包括QT插件机制、插件接口设计、VS2012与QT的集成以及动态...
本示例基于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实现鼠标选中模型...
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实现一款精美的播放器。 完整...
从提供的文件信息中,我们可以提炼出关于Qt5.1类继承关系图的详细知识点,这些知识涉及到Qt的模型视图框架,模型-视图-控制器(MVC)设计模式,以及如何在Qt中使用模型和视图。 首先,Qt的模型视图框架是一组用于...
【Qt5版Nehe OpenGL教程1-5】是一系列针对初学者的教程,旨在通过Qt5框架教授OpenGL图形编程的基本概念和技术。OpenGL是一种强大的跨平台图形库,用于渲染2D和3D图形,而Qt5则是一个流行的开发框架,支持多种操作...