Qt对Opengl的支持情况

Qt提供了对OpenGL的广泛支持,这对于开发需要复杂图形处理的机器视觉软件尤为重要。以下是Qt对OpenGL支持的一些关键方面:

1. 用户界面开发方法: Qt有两种主要的用户界面开发方式:Qt Quick和Qt Widgets。这两种方式都支持与OpenGL图形API的代码结合,分别基于为这两种类型的用户界面优化的独立图形引擎

2. 硬件加速3D图形: Qt支持与OpenGL实现的集成,使开发者能够在更传统的用户界面旁边显示硬件加速的3D图形。Qt提供的示例展示了在Qt应用程序中利用OpenGL的基本技术。

3. OpenGL支持类的迁移: 在Qt 5中,为了支持OpenGL这一跨平台图形API——它是Qt图形基础的一部分——向Qt Gui添加了一组替代的OpenGL支持类。在Qt 6中,这些类已经迁移到了Qt OpenGL模块。

4. OpenGL核心配置文件支持: Qt现在已经扩展了对OpenGL的支持,提供了对OpenGL核心配置文件的访问。使用核心配置文件时,移除了对传统固定功能管线的所有访问。这意味着在屏幕上绘制任何内容都需要使用glsl着色器和顶点数组或缓冲区。

5. 运行时OpenGL实现选择和加载: Qt支持在运行时选择和加载OpenGL实现。这种模式是默认的,并且可以通过在配置脚本中传递-opengl dynamic来显式请求。这种配置在构建时期没有对OpenGL实现进行硬编码的依赖或假设,因此是最灵活的。

通过这些支持,Qt能够使开发者充分利用OpenGL的强大功能,为机器视觉软件提供高性能的图形处理能力。

下面是个Qt OpenGL着色器程序例子。

创建一个完整的Qt OpenGL着色器程序涉及到几个步骤,包括设置OpenGL环境、编写GLSL着色器代码,以及将这些着色器集成到Qt应用程序中。这里提供了一个简单的例子,展示了如何编写头文件和.cpp文件来实现这一点。

首先是头文件(MyGLWidget.h):

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>class MyGLWidget : public QOpenGLWidget
{Q_OBJECTpublic:MyGLWidget(QWidget *parent = nullptr);~MyGLWidget();protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;private:QOpenGLShaderProgram *m_program;int m_vertexLocation, m_matrixLocation, m_colorLocation;QMatrix4x4 m_projMatrix;
};#endif // MYGLWIDGET_H

接着是.cpp文件(MyGLWidget.cpp):

#include "MyGLWidget.h"MyGLWidget::MyGLWidget(QWidget *parent) : QOpenGLWidget(parent), m_program(nullptr)
{
}MyGLWidget::~MyGLWidget()
{makeCurrent();delete m_program;doneCurrent();
}void MyGLWidget::initializeGL()
{m_program = new QOpenGLShaderProgram();m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,"attribute highp vec4 vertex;\n""uniform highp mat4 matrix;\n""void main(void)\n""{\n""   gl_Position = matrix * vertex;\n""}");m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,"uniform mediump vec4 color;\n""void main(void)\n""{\n""   gl_FragColor = color;\n""}");m_program->link();m_program->bind();m_vertexLocation = m_program->attributeLocation("vertex");m_matrixLocation = m_program->uniformLocation("matrix");m_colorLocation = m_program->uniformLocation("color");
}void MyGLWidget::resizeGL(int w, int h)
{m_projMatrix.setToIdentity();m_projMatrix.ortho(0, w, h, 0, -1, 1);
}void MyGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT);static const GLfloat triangleVertices[] = {60.0f,  10.0f,  0.0f,110.0f, 110.0f, 0.0f,10.0f,  110.0f, 0.0f};QColor color(0, 255, 0, 255);m_program->enableAttributeArray(m_vertexLocation);m_program->setAttributeArray(m_vertexLocation, triangleVertices, 3);m_program->setUniformValue(m_matrixLocation, m_projMatrix);m_program->setUniformValue(m_colorLocation, color);glDrawArrays(GL_TRIANGLES, 0, 3);m_program->disableAttributeArray(m_vertexLocation);
}

这个示例展示了一个Qt OpenGL小程序的基础结构,其中包括了着色器程序的初始化、配置和绘制过程。请注意,实际的应用程序可能需要更复杂的设置,包括适当的资源管理和错误处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新版Office2024安装教程

一. 介绍&#xff1a;Office版本都是每三年发布一个版本&#xff0c;从Office 2007、2010、2013、2016、2019&#xff0c;2021到现在的2024。 二. 下载&#xff1a; http://dt1.8tupian.net/2/29913a54b1000.pg3三. 安装教程&#xff1a; 1.用到的软件是开源的脚本&#xff0c…

Docker与微服务实战——基础篇

Docker与微服务实战——基础篇 第一章 Docker 简介1.1 docker 理念1.2 容器与虚拟机比较 第二章 Docker 安装2.1 前提说明2.2 Docker的基本组成2.2.1 镜像&#xff08;image&#xff09;2.2.2 容器&#xff08;container&#xff09;2.2.3 仓库&#xff08;repository&#xff…

python机器学习——决策树

决策树 # 模块导入 from sklearn.tree import ExtraTreeRegressor as ETR, DecisionTreeRegressor as DTRExtraTreeRegressor和DecisionTreeRegressor是scikit-learn库中的两种回归模型&#xff0c;用于拟合和预测连续型目标变量。 决策树是一种基于树结构的机器学习算法&…

VLAN与配置

VLAN与配置 什么是VLAN 以最简单的形式为例。如下图&#xff0c;此时有4台主机处于同一局域网中&#xff0c;很明显这4台主机是能够直接通讯。但此时我需要让处于同一局域网中的PC3和PC4能通讯&#xff0c;PC5和PC6能通讯&#xff0c;并且PC3和PC4不能与PC5和PC6通讯。 为了实…

笔记本电脑 禁用/启用 自带键盘

现在无论办公还是生活 很多人都会选择笔记本电脑 但很多人喜欢机械键盘 或者 用一些外接键盘 但是很多时候我们想操作 会碰到笔记本原来的键盘导致错误操作 那么 我们就需要将笔记本原来的键盘禁用掉 我们先以管理员身份运行命令窗口 然后 有两个命令 禁用默认键盘 sc conf…

你犯过程序员容易犯的这些错误吗?快来看看!

一、前言 写了20多年代码&#xff0c;我见过不下于4位数的程序员&#xff0c;我觉得程序员的能力水平可以分为4个阶段&#xff1a;线性级、逻辑级、架构级和工程级。 同样的在这些人当中&#xff0c;我也发现了8个程序员最常见的陋习&#xff0c;基本上可以覆盖90%的人&#…

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…

大数据毕业设计选题推荐-家具公司运营数据分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

在Windows或Mac上安装并运行LLAMA2

LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一&#xff1a; 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…

我的崽崽跑着跑就长大了

一瞬间感觉你都长这么大了&#xff0c;看着你骑单车的背影&#xff0c;不知不觉心里感觉到有点酸酸的&#xff0c;回头想想看着你&#xff0c;一个人带你在累&#xff0c;在苦都值得&#xff0c;萌娃骑车。 你的可爱能治愈我的一切不快乐。

大数据商城人流数据分析与可视化 - python 大数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

今天零九的雪

下雪了&#xff0c; 漫天大雪。 好大的雪。 远处的鸡鸣&#xff0c; 在一个高嗓门的公鸡的带领下&#xff0c; 应该是醒了。 苍茫的天空下&#xff0c; 白蒙蒙的雾笼罩着山坳&#xff0c; 挡住了远处的山峰&#xff0c; 哦&#xff0c;那不是雾&#xff0c;是雪。 初春的微…

Linux内核移植之主频设置

一. Linux内核移植 正点原子 ALPHA开发板已经添加到 Linux内核里面去了&#xff0c;前面文章关于如何添加已经掌握。但是&#xff0c;还有一些驱动的问题需要修改。 正点原子 I.MX6U-ALPHA 开发板所使用的 I.MX6ULL 芯片主频都是 792MHz 的&#xff0c;也就是NXP 官方宣…

[pytorch]手动构建一个神经网络并且训练

0.写在前面 上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么…

Linux 指令心法(十五)`flash_eraseall` 擦除整个Flash存储器

文章目录 flash_eraseall作用flash_eraseall命令的主要特点和使用场景flash_eraseall命令应用方法flash_eraseall命令可以解决哪些问题?flash_eraseall命令使用时注意事项 flash_eraseall作用 这个命令可以擦除整个Flash存储器&#xff0c;将所有数据清除为初始状态。使用这个…

19.7 Boost Asio 传输序列化数据

序列化和反序列化是指将数据结构或对象转换为一组字节&#xff0c;以便在需要时可以将其存储在磁盘上或通过网络传输&#xff0c;并且可以在需要时重新创建原始对象或数据结构。 序列化是将内存中的对象转换为字节的过程。在序列化期间&#xff0c;对象的状态被编码为一组字节…

数字化转型:云表低代码开发助力制造业腾飞

数字化转型已成为制造业不可避免的趋势。为了应对市场快速变化、提高运营效率以及降低成本&#xff0c;制造业企业积极追求更加智能化、敏捷的生产方式。在这个转型过程中&#xff0c;低代码技术作为一种强大的工具&#xff0c;正逐渐崭露头角&#xff0c;有望加速制造业的数字…

rust持续学习 raw pointer 1

c里头 float a 1; float* p &a; 是可以直接 int * p1 (int*)p; 来强转类型做一些事情的经过了解 rust里是这么操作的 unsafe {std::mem::transmute::<origin_type, target_type>(raw_bytes) };比如上面是四个u8,可以拼一个u32 然后是函数指针这个东西 fn foo()…

Java设计模式——策略模式

1.策略模式简介 策略模式&#xff1a;策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化&#xff0c;行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得…

WindowsServer2019-搭建FTP服务器

这里写自定义目录标题 一、基础配置IP地址安装FTP服务检查连通性Windows10连接FTP服务 二、了解和使用FTP具体模块及其配置1、FTP IP地址和域限制2、FTP SSL设置3、FTP当前会话4、FTP防火墙5、FTP目录浏览6、FTP请求筛选7、FTP日志8、FTP身份验证9、FTP授权规则10、FTP消息11、…