Qt 与C++ 混合编程之OpenGL篇(1)

yuping511313 2015-10-26 10:33:54

之前也是各个地方找,习惯用百度,主要大多是中文的 .找出来的呢大多是我不需要的. 最后是用.....那个大哥了,


1.main.qml
[code=Text]
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QMLQFBO 1.0

Window {
title: qsTr("Hello World")
width: 640
height: 480
visible: true

Rectangle{
anchors.fill: parent;
color:"#33333350"
QMLQFBO{
id:models;
anchors.fill: parent;
}
}

Text {
id: time ;
text: qsTr(models.fnGetTestStr());
font.family: "微软雅黑"
font.pixelSize: 16;
}
Timer{
interval: 1000;
running: true;
repeat: true;
onTriggered: time.text=Date().toString();
}
}

[/code]


2. main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include "qFramebuffer.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

qmlRegisterType<CQFramebuffer>("QMLQFBO", 1, 0, "QMLQFBO");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}


3.qFramebuffer.h

#include <QQuickFramebufferObject>
#include "qFramebufferRender.h"

#include <QVector3D>

class CQFramebuffer:public QQuickFramebufferObject
{
Q_OBJECT
public:
CQFramebuffer();
~CQFramebuffer();

// QQuickFramebufferObject interface
public:
Renderer *createRenderer() const;

public:
Q_INVOKABLE QString fnGetTestStr();

};

qFramebuffer.cpp

#include "qFramebuffer.h"

CQFramebuffer::CQFramebuffer()
{

}

CQFramebuffer::~CQFramebuffer()
{

}
/**
* @brief QFBO::createRenderer
* @return
*/
QQuickFramebufferObject::Renderer *CQFramebuffer::createRenderer()const
{
CQFramebufferRender *cQFBOr = new CQFramebufferRender();
return cQFBOr;
}

QString CQFramebuffer::fnGetTestStr()
{
return "成功返回";
}



3.qFramebufferRender.h

#pragma once
#include <QQuickFramebufferObject>
#include <QOpenGLFramebufferObject>
#include <QOpenGLFunctions>
#include <freeglut.h>
#include "qFramebuffer.h"
#include <QVector3D>
#pragma comment(lib,"freeglut.lib")

/**
* @brief The CQFramebufferRenderclass QQuickFramebufferObject::Renderer
* @author yuping
* @param
* @date
*/
class CQFramebufferRender:public QQuickFramebufferObject::Renderer
{
public:
CQFramebufferRender();
~CQFramebufferRender();

// Renderer interface
public:
void render();
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size);
void synchronize(QQuickFramebufferObject *);

public:
float m_Scale/*保存当前缩放量*/,
m_ScaleFactor/*缩放因子*/,
m_ScaleMax, m_ScaleMin,
m_Angle/*保存当前的旋转角度*/,
m_AngleFactor,
m_AngleY, m_AngleX;
public:
void fnDisplay();
private:
void fnInitGL();
};



.qFramebufferRender.cpp

#include "qFramebufferRender.h"


CQFramebufferRender::CQFramebufferRender()
{
this->m_Angle = 1.0f;
this->m_Scale = 1.0f;

this->m_AngleFactor = 0.1f;
this->m_AngleX =
this->m_AngleY = 1.0f;
this->m_ScaleFactor = 0.5f;
this->m_ScaleMax = 4.0f;
this->m_ScaleMin = 0.5f;

this->fnInitGL();

}

CQFramebufferRender::~CQFramebufferRender()
{

}
QOpenGLFramebufferObject *CQFramebufferRender::createFramebufferObject(const QSize &size)
{ // create opengl FBO
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
QOpenGLFramebufferObject *qoglfbo = new QOpenGLFramebufferObject(size, format);
this->fnInitGL();
return qoglfbo;
}
//开始每帧的渲染工作
void CQFramebufferRender::render()
{
QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);
this->fnDisplay();
update();
}
/**
* @brief CQFBOr::synchronize 窗口大小改变时
* @param item
*/
void CQFramebufferRender::synchronize(QQuickFramebufferObject *item)
{
CQFramebuffer *fbitem = static_cast<CQFramebuffer *>(item);
}
void CQFramebufferRender::fnDisplay()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

#pragma region 二,与调整模型的位置来实现 平移,旋转,缩放
glRotatef(m_AngleX,1.0f,0,0);//绕X轴
//glRotatef(m_AngleY,0.0f,1.0f,0.0f);//绕Y轴
//glRotatef(angle,0.0f,0.0f,1.0f);//绕Z轴
// glScalef(m_Scale,m_Scale,m_Scale);//缩放
#pragma endregion

glPushMatrix();
glTranslatef(0,0,0);
glLineWidth(5.5f);
glBegin(GL_LINES);
glColor3f(0.5f,0.0f,0.0f);
glVertex2f(-0.5f,0);
glVertex2f(0.5f,0);
glColor3f(0.0f,0.5f,1.0f);
glVertex3f(0,-0.5f,0.2f);
glVertex3f(0,1.5f,0.2f);
glEnd();
glPopMatrix();

}
//只初始化一次
void CQFramebufferRender::fnInitGL()
{

glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glShadeModel(GL_SMOOTH);//着色模式平滑
glClearColor(0.2f, 0.2f, 0.2f, 0.5f);//设置背景颜色
glClearDepth(1.0f); //设置深度缓存的清除值
glEnable(GL_DEPTH_TEST); //开启深度检测
glDepthFunc(GL_LEQUAL); //油墨深度缓存的函数,然后,靠近的就绘制在上面
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//视图修正 打开最高质量渲染
//glEnable(GL_LIGHT0);//打开1号光源
glMatrixMode(GL_PROJECTION);//设置当前矩阵为透视矩阵
glLoadIdentity();//加载一个单位矩阵
gluPerspective(60.0f,1, 1,5000);//设置透视参数
glMatrixMode(GL_MODELVIEW);// -----模型视图矩阵
glLoadIdentity();

glClearColor(1.0f,0.6f,0.1f,0.5f);
gluLookAt(0.0f,0.0f,20.0f, //eye x,y,z
0, 0, 0, //center x,y,z
0.0f, 1.0f, 0.0f);//up x,y,z
}



大功告成!

最后你看见是两条线 一条不动一条以x轴旋转 ..以后的主慢慢来咯

最,最,最,简单的入门了.......



...全文
364 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧