当前位置: 首页 > wzjs >正文

主流的外贸平台深圳网络推广优化

主流的外贸平台,深圳网络推广优化,使用经典wordpress编辑器使用手册,重庆网站建设怎么样QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口,并且需要实现加载模型后重新渲染更新窗口的功能,但是一直无法更新被卡住了,现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…

QOpenGLWidget动态加载功能实现教程

我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口,并且需要实现加载模型后重新渲染更新窗口的功能,但是一直无法更新被卡住了,现在把问题解决了总结一下整个实现过程。


创建一个自己的OpenGLWidget类

QOpenGLWidget提供的是接口,我们需要继承该接口类来实现自己的OpenGLWidget类,我命名为MyGLWidget。

另外还需要继承QOpenGLFunctions类,这是提供封装好的OpenGL相关功能,免去我们大量的gl代码。该类模板在官方示例中也能找到。

我现在要实现这个功能:创建好OpenGL窗口后,不提供任何顶点数据,我加载数据后再去重新渲染。为了把演示功能简化,我把加载模型的函数改为添加三角形addTriangle函数替代。

完整的h文件如下

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{Q_OBJECTpublic:explicit MyGLWidget(QWidget* parent = nullptr);~MyGLWidget();public slots:void addTriangle(); // 用于添加三角形protected:void initializeGL() override;void paintGL() override;void resizeGL(int w, int h) override;private:bool showTriangle = false;  // 是否显示三角形QOpenGLShaderProgram shaderProgram;QOpenGLBuffer vbo;QOpenGLVertexArrayObject vao;
};#endif // MYGLWIDGET_H

继承QOpenGLWidget后必须需要实现以下三个函数

  • void initializeGL() override;
  • void paintGL() override;
  • void resizeGL(int w, int h) override;

三个函数的作用顾名思义不再赘叙。

成员变量里面使用的都是Qt帮我封装好的:

  • QOpenGLShaderProgram
  • QOpenGLBuffer
  • QOpenGLVertexArrayObject

包括创建绑定的这些功能都直接帮我们封装好的,适合我们用面向对象的编程风格。

加载模型(三角形)数据的函数,我用addTriangle普通函数实现,即可作为普通函数,可以作为槽函数,看你的具体调用方式


实现接口给定的三个虚函数

我们重点要实现的initializeGL初始化和paintGL绘制函数:

  • initializeGL()
void MyGLWidget::initializeGL()
{initializeOpenGLFunctions();// 创建着色器shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex,"#version 330 core\n""layout(location = 0) in vec3 position;\n""void main() {\n""   gl_Position = vec4(position, 1.0);\n""}");shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment,"#version 330 core\n""out vec4 FragColor;\n""void main() {\n""   FragColor = vec4(1.0, 0.5, 0.2, 1.0);\n""}");shaderProgram.link();vao.create();vao.bind();vbo.create();vbo.bind();vbo.setUsagePattern(QOpenGLBuffer::DynamicDraw);vao.release();vbo.release();
}

其中initializeOpenGLFunctions()这个一开头就需要使用,算是固定格式。然后对shaderProgram,vao和vbo初始化,而vbo不需要分配任何数据。

  • paintGL()
void MyGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT);if (showTriangle) {shaderProgram.bind();vao.bind();glDrawArrays(GL_TRIANGLES, 0, 3);vao.release();shaderProgram.release();}
}

绘制函数也可以很基础,我们根据判断如果加载三角形了再进行绘制。

  • resizeGL(int w, int h)
void MyGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h);
}

resizeGL没有特别需求的话就只需要这样写即可。


重点:加载函数的书写

这一步对于刚用的人来说简直是神坑,我不卖关子了,先抛出神坑的点:

在上述三个虚函数以为的函数或者构造函数,要使得OpenGL API的函数起作用,必须要先调用makeCurrent()函数,以确保使用的都是当前的上下文。

不调用makeCurrent()的话,你往vbo里面存放数据也是不会被绘制出来的。

void MyGLWidget::addTriangle()
{makeCurrent();		//重中之重!!!!!!!!!!!showTriangle = true; // 标记显示三角形qDebug() << "add Triangle";GLfloat vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};vao.bind();vbo.bind();vbo.allocate(vertices, sizeof(vertices));shaderProgram.bind();shaderProgram.enableAttributeArray(0);shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3);for (GLenum err; (err = glGetError()) != GL_NO_ERROR;) {qDebug() << "error:" << err;}vao.release();vbo.release();shaderProgram.release();update(); // 触发重绘doneCurrent();	//结束后调用doneCurrent
}

完整的cpp文件代码

#include "MyGLWidget.h"
#include <QOpenGLShader>
#include <QDebug>MyGLWidget::MyGLWidget(QWidget* parent): QOpenGLWidget(parent), vbo(QOpenGLBuffer::VertexBuffer)
{
}MyGLWidget::~MyGLWidget()
{makeCurrent();vbo.destroy();vao.destroy();shaderProgram.removeAllShaders();doneCurrent();
}void MyGLWidget::initializeGL()
{initializeOpenGLFunctions();// 创建着色器shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex,"#version 330 core\n""layout(location = 0) in vec3 position;\n""void main() {\n""   gl_Position = vec4(position, 1.0);\n""}");shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment,"#version 330 core\n""out vec4 FragColor;\n""void main() {\n""   FragColor = vec4(1.0, 0.5, 0.2, 1.0);\n""}");shaderProgram.link();vao.create();vao.bind();vbo.create();vbo.bind();vbo.setUsagePattern(QOpenGLBuffer::DynamicDraw);vao.release();vbo.release();
}void MyGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT);if (showTriangle) {shaderProgram.bind();vao.bind();glDrawArrays(GL_TRIANGLES, 0, 3);vao.release();shaderProgram.release();}
}void MyGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h);
}void MyGLWidget::addTriangle()
{makeCurrent();showTriangle = true; // 标记显示三角形qDebug() << "add Triangle";GLfloat vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};vao.bind();vbo.bind();vbo.allocate(vertices, sizeof(vertices));shaderProgram.bind();shaderProgram.enableAttributeArray(0);shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3);for (GLenum err; (err = glGetError()) != GL_NO_ERROR;) {qDebug() << "error:" << err;}vao.release();vbo.release();shaderProgram.release();update(); // 触发重绘doneCurrent();
}

主程序调用方法

main.cpp

#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include "MyGLWidget.h"int main(int argc, char* argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout* layout = new QVBoxLayout(&window);MyGLWidget* glWidget = new MyGLWidget();QPushButton* button = new QPushButton("添加三角形");layout->addWidget(glWidget);layout->addWidget(button);QObject::connect(button, &QPushButton::clicked, glWidget, &MyGLWidget::addTriangle);window.show();return app.exec();
}

运行效果:

加载前:
在这里插入图片描述

加载后:
在这里插入图片描述

http://www.dtcms.com/wzjs/397425.html

相关文章:

  • 辽宁省住房和城乡建设部网站厦门零基础学seo
  • 有ecs怎么做网站百度云官网
  • 开发房地产需要多少钱石家庄seo网络优化的公司
  • 上海比较好的电商公司有哪些seo整站网站推广优化排名
  • 传媒公司网站源码php近日发生的重大新闻
  • 怎么搜索网站内容淘宝关键词搜索量排名
  • z-blog和wordpress哪个好seo排名规则
  • 佛山网站策划公司优化网站关键词的技巧
  • 4s店网站建设济南头条新闻热点
  • 如何在服务器上做网站微信指数查询
  • 如何做游戏网站画质优化app下载
  • 底价网站建设广州网站营销seo费用
  • 网站开发语言占有率代发关键词排名包收录
  • 天河wap网站建设公司重庆百度seo
  • 网站建设会议百度关键词广告怎么收费
  • 想开个网站建设的公司广告免费发布信息
  • 珠海科技网站建设win7最好的优化软件
  • 安徽建筑大学学工在线网站如何建造一个网站
  • 如何做供求网站网站运营推广
  • 免费网站建设方案数据分析师35岁以后怎么办
  • 建设网站英文百度云登录首页
  • 做cpa联盟必须要有网站吗网络营销心得体会800字
  • wordpress承载的数据微博关键词排名优化
  • 网站开发功能模块清单开淘宝店铺怎么运营推广
  • 注册网站要多久惠州疫情最新消息
  • 台州北京网站建设seo教程seo教程
  • java做网站的软件南宁推广软件
  • 湛江大型网站模板建设优质网站
  • 装饰公司网站建设怎么创建一个网站
  • 温州做企业网站杭州seo外包