C++/QT环境下图像在窗口下等比例渲染绘制

本文中通过QT获取到opengl上下文环境,通过opengl3.0API将图像等比例渲染到QOpenGLWidget组件上面,相比cpu,渲染能力更强。
有以下四步骤。opengl基本知识点可参照之前文章OPENGL初学习

  1. 定义opengl渲染表面属性
  2. 通过initializeGL接口初始化opengl上下文环境,然后加载并链接着色器程序,创建顶点以及纹理,
  3. 通过paintGL接口完成单帧渲染
  4. 通过``接口实现窗口缩放逻辑,这一步比较简单,只需要接口内调用glViewport(0, 0, w, h);即可

下面展开步骤讲解

定义opengl渲染表面属性

通过QSurfaceFormat 的设置,QSurfaceFormat 用于定义 OpenGL 渲染表面的属性,例如缓冲区大小、颜色深度、双缓冲、OpenGL 版本等。
这些属性必须在 OpenGL 上下文创建之前设置,因为它们是创建 OpenGL 上下文的基础。
如果尝试在 initializeGL() 中设置 QSurfaceFormat,OpenGL 上下文已经创建,此时修改格式是无效的。

  1. OpenGL 版本兼容性:
    确保硬件和驱动程序支持指定的 OpenGL 版本(如 3.3)。
    如果不支持,OpenGL 上下文将无法创建。
  2. 缓冲区大小:
    深度缓冲区和模板缓冲区的大小应根据应用程序的需求设置。
    24 位深度缓冲区和 8 位模板缓冲区是常见的配置。
  3. 核心模式:
    核心模式仅支持现代 OpenGL 功能,确保代码不使用已弃用的功能(如固定功能管线)。
  4. 默认格式:
    通过 QSurfaceFormat::setDefaultFormat(format) 设置默认格式后,所有后续创建的 OpenGL 表面都会使用此格式。
  QSurfaceFormat format;format.setDepthBufferSize(24);format.setStencilBufferSize(8);format.setVersion(3, 3);format.setProfile(QSurfaceFormat::CoreProfile);format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);QSurfaceFormat::setDefaultFormat(format);

initializeGL

这一步中要对顶点信息、纹理以及着色器程序进行初始化
顶点信息用于映射顶点以及纹理坐标,以此实现将图像等比例显示在窗口中心,顶点着色器程序将顶点位置转换为齐次坐标,并将将顶点颜色和纹理坐标传递给片段着色器;片段着色器程序使用纹理坐标从纹理中采样颜色赋值给 FragColor进行渲染

顶点

  1. 创建顶点数据,4*8,每一行数据分别代表右上 右下 左下 左上顶点。每行数据有8个元素,前三个数据是顶点坐标,由于是二维图像,因此z是0,;中间三个是颜色数据,最后两个是纹理坐标。

    GLfloat vertices_tmp[] = {2.0f,  2.0f,  0.0f, 1.0f, 0.0f, 0.0f, 1.0f,1.0f,  // 右上2.0f,  -2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,0.0f,  // 右下-2.0f, -2.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,0.0f,  // 左下-2.0f, 2.0f,  0.0f, 1.0f, 1.0f, 0.0f, 0.0f,1.0f  // 左上
    };
    memcpy(vertices, vertices_tmp, sizeof(vertices));  
    
  2. 纹理坐标映射:映射逻辑是保持纹理坐标不变,将图像等比例四个点在宽度与高度方向计算图像缩放比,然后将缩放值填充到vertices对应位置,即是将图像渲染到窗口等比例显示的区域

    void GLShowPicWidget::generate_vertex(int img_w, int img_h) {float w_delta_ratio1 = 1;float h_delta_ratio1 = 1;if (img_w != -1 && img_h != -1) {float w_ratio = (float)img_w / width();float h_ratio = (float)img_h / height();float ratio = std::max(w_ratio, h_ratio);_img_label_fix_width = img_w / ratio;_img_label_fix_height = img_h / ratio;w_delta_ratio1 = (float)_img_label_fix_width / width();h_delta_ratio1 = (float)_img_label_fix_height / height();} else {_img_label_fix_width = width();_img_label_fix_height = height();}_img_lx = (width() - _img_label_fix_width) / 2;_img_ly = (height() - _img_label_fix_height) / 2;vertices[0] = w_delta_ratio1;vertices[1] = h_delta_ratio1;vertices[8] = w_delta_ratio1;vertices[9] = 

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

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

相关文章

一次统计信息收集导致的Oracle数据库查询慢分析

客户反馈在18.30-19.00之间,数据库运行特别慢,19点后就恢复正常。根据客户提出的信息,查看对应时段的awr报告,发现在此时段内,对表XXX_XXXX_SCAN存在着大量的查询操作。同时,查看该表的统计信息时间&#x…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…

瑞利衰落信道机理的详解

瑞利衰落信道(Rayleigh fading channel)是一种无线电信号传播环境的统计模型,用于描述信号在无线信道中的传播特性。这种模型假设信号通过无线信道后,其信号幅度是随机的,即“衰落”,并且其包络服从瑞利分布…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。在上一篇博客文章中,已经对TCP协议及如何编程实现进行了详细的梳理讲解,在本文中,主要讲解与TCP一样广泛使用了另一种协议&#xff1a…

大象机器人发布首款穿戴式数据采集器myController S570,助力具身智能数据收集!

myController S570 具有较高的数据采集速度和远程控制能力,大大简化了人形机器人的编程。 myController S570 是一款可移动的轻量级外骨骼,具有 14 个关节、2 个操纵杆和 2 个按钮,它提供高数据采集速度,出色的兼容性&#xff0c…

数据库存储上下标符号,sqlserver 2008r2,dm8

sqlserver 2008r2: 数据类型需要用nvarchar插入数据时字符串前需要用N create table test( col1 varchar(50), col2 nvarchar(50) ) insert into test(col1,col2) values(U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀,U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀) insert into…

海康工业相机的应用部署不是简简单单!?

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 笔者使用的设备及环境:WSL2-Ubuntu22.04MV-CS016-10UC 不会吧?不会吧?不会还有人拿到海康工业相机还是一脸懵叭?不会还有人…

Java 对象池管理的高性能工具库 Apache Commons Pool 2

Apache Commons Pool 2 是一个用于对象池管理的高性能工具库,主要用于管理复用昂贵的对象(如数据库连接、网络连接、线程等)。它实现了常见的对象池模式,可以通过配置来优化资源的分配与回收。 Maven 依赖 在项目中添加 commons-…

Vue 中实现修改数组,并保持页面渲染数据是响应式更改

如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的,直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新,你可以使用 Vue 提供的 Vue.set() 方法(在 Vue 2 中)或使用 this.$set() 方法(在 Vue…

为什么要内存对齐?

内存对齐 初步认识 内存对齐是什么&#xff1f;从下面的代码可以比较直观地有一个简单的认识&#xff1a; #include <iostream>using namespace std;struct s1 {int i;char c1;char c2; };struct s2 {char c1;int i;char c2; };struct s3 {char c1;char c2;int i; };i…

MySQL HASH索引详解

文章目录 一、定义二、工作原理三、优缺点四、应用场景五、案例及分析 一、定义 HASH索引是一种基于哈希表实现的索引结构。它通过哈希函数将索引键值映射到一个固定长度的哈希值&#xff0c;并将这个哈希值存储在哈希表中。这种索引结构特别适用于等值查询&#xff0c;能够显…

[创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。

目录 前言&#xff1a; 华为&#xff1a;客户需求牵引下的闭环系统创新 前言&#xff1a; 华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。华为的流程大到战略&#xff0c;小到日常工作&#xff0c;是由无数个自我调节…

【SQL 中的分组查询与联合查询详解】

文章目录 SQL 中的分组查询与联合查询详解1. GROUP BY分组查询1.1 语句格式1.2 示例说明1.2.1 分别查询哥哥组和弟弟组的英语成绩总和1.2.2 查询哥哥组的所有成绩总和 2. 联合查询2.1 内连接2.1.1 语法格式2.1.2 执行过程 2.2 外连接2.2.1 左外连接2.2.2 右外连接 2.3 自连接2.…

《FMambaIR:一种基于混合状态空间模型和频域的方法用于图像恢复》学习笔记

paper&#xff1a;(PDF) FMambaIR: A Hybrid State Space Model and Frequency Domain for Image Restoration 目录 摘要 一、引言 二、相关工作 1、图像恢复 2、频率学习 3、状态空间模型&#xff08;SSM&#xff09; 三、框架 1、基本知识 2、整体框架 3、F-Mamba…

Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20241230

逐笔委托逐笔成交下载 链接: https://pan.baidu.com/s/11Tdq06bbYX4ID9dEaiv_lQ?pwdcge6 提取码: cge6 Level2逐笔成交逐笔委托数据分享下载 利用Level2的逐笔交易和委托数据&#xff0c;这种以毫秒为单位的详细信息能揭露众多关键信息&#xff0c;如庄家意图、伪装行为&…

51c自动驾驶~合集47

我自己的原文哦~ https://blog.51cto.com/whaosoft/13083194 #DreamDrive 性能爆拉30%&#xff01;英伟达&#xff1a;时空一致下的生成重建大一统新方案~ 从自车的驾驶轨迹中生成真实的视觉图像是实现自动驾驶模型可扩展训练的关键一步。基于重建的方法从log中生成3D场景…

AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式

Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…

SpringBoot项目打war包要点

1. 修改pom文件packaging 2. 不使用内置tomcat 3. 加一个类 4. 修改外部tomcat配置文件 5. 修改nginx配置文件&#xff0c;构建集群 资料来自网络

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…

华为数据中心CE系列交换机级联M-LAG配置示例

M-LAG组网简介 M-LAG&#xff08;Multi-chassis Link Aggregation&#xff09;技术是一种跨设备的链路聚合技术&#xff0c;它通过将两台交换机组成一个逻辑设备&#xff0c;实现链路的负载分担和故障切换&#xff0c;从而提高网络的可靠性和稳定性。下面给大家详细介绍如何在…