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,选择单 ...
随机推荐
- 驱动7段LED显示器
拿到7段LED显示器,先看看是共阴极还是共阳极,如果是共阳极,3和8接5V,5V串联一个220欧姆的电阻. 下面是购买的LED显示器的接线图例 5V串联电阻图例 下面为代码,此代码将实现在LED显示器 ...
- float 属性详解
当前元素分类(float:left) 下一个紧邻元素分类(不含float) 结论 块级元素(a) 块级元素(b) b会填充a遗留下来的空间,a会和b发生重叠,a的图层在上面. 内联元素(b) b会紧跟 ...
- angularjs-xeditable整合typeahead完成智能提示
按照需求,需要在angularjs的xeditable中加入typeahead,来完成智能提示,并且在选择后,把该条数据的其他信息也显示在此行中,于是做了一下的测试修改. 当然,既然用了xeditab ...
- AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决
今天使用 AsyncHttpClient 开源库,遇到个很崩溃的问题: 方法 setEnableRedirects(false); 从名称上看应该是重定向开关的方法,设置为 false 后则普通请 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1005 Balanced Game
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- [NEUQ-OJ] 1012 SZ斐波拉契数列
一道水题,让我看清基础我的基础是多么薄弱. 递归,数组清零,数组名/变量名重复层出不穷...路漫漫啊.......... http://ncc.neuq.edu.cn/oj/problem.php?i ...
- SQLite语句
搜索某属性: select exp from player where level = 2; 创建表: create table player (level integer primary key, ...
- JNDI实现服务器(tomcat)与数据库(mysql)连接的数据源配置以及获取连接的java代码
->首先将mysql的jar包导入到tomcat/lib文件夹下 ->然后在tomcat/conf/context.xml文件中配置以下内容 <Resource name=" ...
- surface pro系统按键+重装系统
一. 如果无法进入系统: surface pro1代,可以插入U盘启动盘,然后按音量键上键,然后按电源键,然后释放电源键,然后等屏幕上"Surface"出来后,释放音量键. 2代以 ...
- 微信小程序开发详解——小程序,大颠覆!
微信小程序开发 联系 苏念 188.1414.7927 微信小程序系统开发 微信新功能开发 小程序开发 小程序怎么开发 app小程序开发 简化小程序开发 微信小程序定制 小程序制作 开发微信小程序 ...