Qt5 OpenGL框架
#ifndef MYRENDERER_H
#define MYRENDERER_H #include <QOpenGLContext>
#include <QOpenGLFunctions>
#include <QSurface>
#include <QSurfaceFormat>
#include <QScreen>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QColor>
#include <QSize>
class MyRenderer : public QObject
{
Q_OBJECT
public:
MyRenderer(QSurfaceFormat & format, MyRenderer * share = 0, QScreen * screen = 0);
QSurfaceFormat format() const {return m_format;}
public slots:
void Render(QSurface * surface, const QColor & color, const QSize & size);
private:
void Initialize();
void Init_QUAD_VBO();
void Init_QUAD_Shader();
void Draw_QUAD();
private:
bool m_bInitialized;
QSurfaceFormat m_format;
QOpenGLContext * m_context; QOpenGLFunctions * m_fun;
QOpenGLShader * m_QUAD_vShader;
QOpenGLShader * m_QUAD_fShader;
QOpenGLShaderProgram * m_QUAD_program; QVector<QVector3D > m_quad_vertices;
GLuint m_quad_vbo; GLuint m_MODEL_MATRIX_LOC;
GLuint m_VIEW_MATRIX_LOC;
GLuint m_PROJECTION_MATRIX_LOC; QMatrix4x4 m_model_matrix;
QMatrix4x4 m_view_matrix;
QMatrix4x4 m_projection_matrix;
QSize m_viewSize;
}; #endif // MYRENDERER_H
#include "myrenderer.h" MyRenderer::MyRenderer(QSurfaceFormat &format, MyRenderer *share, QScreen *screen)
:m_bInitialized(false)
,m_format(format)
,m_context()
,m_fun()
,m_QUAD_vShader()
,m_QUAD_fShader()
,m_QUAD_program()
{
m_context = new QOpenGLContext(this);
if (screen)
{
m_context->setScreen(screen);
}
m_context->setFormat(format);
if (share)
{
m_context->setShareContext(share->m_context);
}
m_context->create();
} void MyRenderer::Render(QSurface * surface, const QColor & color, const QSize & viewSize)
{
m_viewSize = surface->size();
if (m_context == NULL)
{
return;
}
if (m_context->makeCurrent(surface) != true)
{
return;
}
if (m_bInitialized == false)
{
m_bInitialized = true;
Initialize();
}
m_fun->glViewport(, , surface->size().width(), surface->size().height());
m_fun->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
m_fun->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Draw_QUAD();
m_context->swapBuffers(surface);
} void MyRenderer::Initialize()
{
m_fun = m_context->functions();
m_fun->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Init_QUAD_VBO();
Init_QUAD_Shader();
} void MyRenderer::Init_QUAD_VBO()
{
m_quad_vertices << QVector3D(-1.0f, -1.0f, 0.0f);
m_quad_vertices << QVector3D(1.0f, -1.0f, 0.0f);
m_quad_vertices << QVector3D(1.0f, 1.0f, 0.0f);
m_quad_vertices << QVector3D(-1.0f, 1.0f, 0.0f); m_fun->glGenBuffers(, &m_quad_vbo);
m_fun->glBindBuffer(GL_ARRAY_BUFFER, m_quad_vbo);
m_fun->glBufferData(GL_ARRAY_BUFFER, sizeof(float) * * m_quad_vertices.size(), &m_quad_vertices.at(), GL_STATIC_COPY);
m_fun->glBindBuffer(GL_ARRAY_BUFFER, );
} void MyRenderer::Init_QUAD_Shader()
{
m_QUAD_vShader = new QOpenGLShader(QOpenGLShader::Vertex, this);
m_QUAD_fShader = new QOpenGLShader(QOpenGLShader::Fragment, this);
m_QUAD_program = new QOpenGLShaderProgram(this);
m_QUAD_vShader->compileSourceFile(":/quad.vert");
m_QUAD_fShader->compileSourceFile(":/quad.frag");
m_QUAD_program->addShader(m_QUAD_vShader);
m_QUAD_program->addShader(m_QUAD_fShader);
m_QUAD_program->link(); m_MODEL_MATRIX_LOC = m_QUAD_program->uniformLocation("MODEL_MATRIX");
m_VIEW_MATRIX_LOC = m_QUAD_program->uniformLocation("VIEW_MATRIX");
m_PROJECTION_MATRIX_LOC = m_QUAD_program->uniformLocation("PROJECTION_MATRIX");
} void MyRenderer::Draw_QUAD()
{ m_model_matrix.setToIdentity();
m_view_matrix.setToIdentity();
m_projection_matrix.setToIdentity(); m_view_matrix.lookAt(QVector3D(0.0f, 0.0f, 10.0f), QVector3D(0.0f, 0.0f, 0.0f), QVector3D(0.0, 1.0f, 0.0f));
m_projection_matrix.perspective(45.0f, m_viewSize.width()/ m_viewSize.height(), 1.0f, 100.0f); m_QUAD_program->bind();
m_QUAD_program->setUniformValue(m_MODEL_MATRIX_LOC, m_model_matrix);
m_QUAD_program->setUniformValue(m_VIEW_MATRIX_LOC, m_view_matrix);
m_QUAD_program->setUniformValue(m_PROJECTION_MATRIX_LOC, m_projection_matrix); m_fun->glBindBuffer(GL_ARRAY_BUFFER, m_quad_vbo);
m_fun->glEnableVertexAttribArray();
m_fun->glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, , );
m_fun->glDrawArrays(GL_QUADS, , );
m_fun->glDisableVertexAttribArray();
m_fun->glBindBuffer(GL_ARRAY_BUFFER, );
m_QUAD_program->release();
}
#ifndef MYFRAME_H
#define MYFRAME_H #include "myrenderer.h"
#include <QWindow>
class MyFrame : public QWindow
{
Q_OBJECT
public:
MyFrame(const QSharedPointer<MyRenderer> & renderer);
signals:
void NeedRender(QSurface * surface , const QColor & color, const QSize & viewSize);
private:
void Render();
protected:
void exposeEvent(QExposeEvent *);
void timerEvent(QTimerEvent *);
private:
QSharedPointer<MyRenderer> m_myRenderer;
}; #endif // MYFRAME_H
#include "myframe.h" MyFrame::MyFrame(const QSharedPointer<MyRenderer> &renderer)
:m_myRenderer(renderer)
{
setSurfaceType(QWindow::OpenGLSurface);
setFormat(renderer->format());
setGeometry(, , , );
connect(this, SIGNAL(NeedRender(QSurface*,QColor,QSize)),
renderer.data(), SLOT(Render(QSurface*,QColor,QSize)));
startTimer();
} void MyFrame::Render()
{
if (isExposed())
emit NeedRender(this, QColor(0.0f, 0.0f, 0.0f, 1.0f), size());
} void MyFrame::exposeEvent(QExposeEvent *)
{
Render();
} void MyFrame::timerEvent(QTimerEvent *)
{
Render();
}
#version
layout(location = ) in vec4 VERTEX;
uniform mat4 MODEL_MATRIX;
uniform mat4 VIEW_MATRIX;
uniform mat4 PROJECTION_MATRIX;
out vec4 VERTEX_COLOR;
void main()
{
VERTEX_COLOR = VERTEX;
gl_Position = PROJECTION_MATRIX * VIEW_MATRIX * MODEL_MATRIX * VERTEX;
}
#version
out vec4 FragColor;
in vec4 VERTEX_COLOR;
void main()
{
FragColor = VERTEX_COLOR;
}
#include "myframe.h"
#include <QGuiApplication> int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
QScreen * screen = QGuiApplication::primaryScreen();
QSurfaceFormat format;
format.setDepthBufferSize();
format.setSamples();
QSharedPointer<MyRenderer>renderer(new MyRenderer(format, , screen));
MyFrame w(renderer);
w.setVisible(true);
w.show();
return a.exec();
}
Qt5 OpenGL框架的更多相关文章
- OpenGL框架+QT版
原地址:http://blog.chinaunix.net/uid-25799257-id-3498005.html 之前一直做地图的算法,没什么时间学习opengl,之前看nehe_OpenGL.c ...
- VC基于单文档OpenGL框架
本文是在VC6.0的环境下,运用MFC实现的OpenGL最基本框架,需要简单了解MFC编程(会在VC6.0里创建MFC单文档应用程序就行),甚至不必了解OpenGL的知识.以下是具体的步骤. 1.创建 ...
- QT5 OpenGL (六, 键盘事件, 开关灯,放大缩小综合运用)
概要 实例效果图 立体图放大图 立体图缩小图 不加矢量开灯图 不加矢量关灯图 加矢量关灯图1 加矢量关灯图2 部分代码展示 主要内容解析 QT键盘事件 立体图形的放大和缩小 上下左右键以及A键D争键控 ...
- OpenGL编程-OpenGL框架-win32项目
在win32项目中开发的程序 小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的 程序运行结果是这样的 源代码:对第45行进行覆盖 # ...
- 基于对话框的Opengl框架
转自:http://blog.csdn.net/longxiaoshi/article/details/8238933 12-11-29 14:55 1198人阅读 评论(6) 收藏 举报 分类: ...
- iOS 底层框架的浅析
1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...
- ios框架
iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设备的操作系统. 1,Core OS: 是用FreeBSD和Mach所改写的Darwin, 是开源 ...
- (1)opengl-nehe 4种框架
http://www.yakergong.net/nehe/ 这个网站还是opengl方面比较权威的,作者叫nehe 这东西估计是要先装个ndk,然后才能运行代码 先睡觉! 以下内容参考自http:/ ...
- MFC中添加OpenGL
WINDOWS下展示OpenGL有多种形式: MFC 或 win32,该如何向MFC中添加OpenGL?下面是介绍最简单OpenGL框架. 1.首先通过VS建立MFC应用程序-MyOpenGL,选择单 ...
随机推荐
- 64位win7系统中vb工程显示加载MSCOMCTL.OCX失败
MSCOMCTL.OCX明明已经注册成功,但还是提示加载失败,对象未注册 尝试过的方法:system32中注册,syswow64中注册,vb打sp6补丁, 修改工程文件:用记事本打开VBP文件找到这一 ...
- QGIS
project(GisFreeMap) set(CMAKE_BUILD_TYPE Debug) find_package(Qt4 REQUIRED QtCore QtGui QtXml) includ ...
- 开通域名绑定DDNS
一.初衷 我想要有一个自己的域名,然后有自己的server,在server上搭一个网站或者开通一个ftp服务,我想通过这个域名来访问它. 二.什么是DDNS DDNS 动态dns,电信宽带采用拨号联网 ...
- Java 后台sql注入
JdbcTemplate.update(sql, ArrayList.toArray()) Connection conn = null; PreparedStatement ps = null; c ...
- [读书笔记]python3.5实现socket通讯(TCP)
TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的 ...
- 四位len灯流水
#include <msp430x14x.h> //#include<intrins.h> #define uint unsigned int void delay(long ...
- NGINX----源码阅读---config配置脚本
config文件为nginx的配置入口文件. 1. #!/bin/sh # Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. LC_ALL=C ...
- java中的反编译
使用JD-GUI工具 支持mac os 和 windows 地址为:http://jd.benow.ca
- C#中XmlSerializer的内存占用问题
被XmlSerializer掉坑里了,爬了一晚上才出来. 本来实现一个功能,从数据库中查出一堆数据(比较多,几十万,不过,是分批查出来的),查出来的数据包含了一个XML字符串,代码中对其进行序列化,一 ...
- hibernate主键generator属性介绍
increment(递增) 用于为long, short或者int类型生成唯一标识.只有在没有其他进程往同一张表中插入数据时才能使用. 在集群下不要使用. identity (标识)对DB2,MySQ ...