Qt OpenGL程序在Windows下正常,但在Linux下无显示问题【已解决】

Qt OpenGL程序在Windows下正常,但在Linux下无显示问题【已解决】

  • 引言
  • 一、问题描述
  • 二、解决方案
  • 三、解决过程记录
    • 3.1 定位问题
    • 3.2 解决问题,深入分析

引言

在Windows上正常运行的OpenGL程序,到Linux下正常编译…但是没有任何显示(只有背景颜色)。解决过程略曲折,特此记录问题以及解决方案,顺便留下解决过程方便复盘…

一、问题描述

在Windows上正常运行的OpenGL程序,在Linux下无任何显示… 人都傻了

  • 同步在Windows和Linux调试,发现透视投影矩阵的值不同
  • 进一步测试,发现painter.beginNativePainting();会改变透视投影矩阵

二、解决方案

painter.beginNativePainting();语句之后重新设置透视投影矩阵即可:

    1. void QopenGLDemo::resizeGL(int w, int h)中增加:
this->aspect = double(w) / h;  //备份 方便在paintGL重新建立透视投影矩阵
    1. void QopenGLDemo::paintGL()中,painter.beginNativePainting();语句之后重新建立透视投影矩阵
	QPainter painter(this);
    painter.beginNativePainting();
    // 在Linux下较为特殊,需在painter.beginNativePainting(); 后重新设置透视投影矩阵
    glMatrixMode(GL_PROJECTION);      //选择投影矩阵
    glLoadIdentity();                 //重置投影矩阵 为 单位矩阵
    gluPerspective(45.0, this->aspect, 0.1, 1000.0);  //建立透视投影

    // --------------------------- OpenGL start----------------------------------
    1. 需要注意一点,如果后续代码有glLoadIdentity,记得选择模型矩阵,而不是投影矩阵 (如果不选择,默认还是重置投影矩阵)。完整修复bug代码如下所示:
void QopenGLDemo::paintGL(){

    QPainter painter(this);
    painter.beginNativePainting();
    // 在Linux下较为特殊,需在painter.beginNativePainting(); 后重新设置透视投影矩阵
    glMatrixMode(GL_PROJECTION);      //选择投影矩阵
    glLoadIdentity();                 //重置投影矩阵 为 单位矩阵
    gluPerspective(45.0, this->aspect, 0.1, 1000.0);  //建立透视投影

    // --------------------------- OpenGL start----------------------------------

    // 初始化
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存
    glMatrixMode(GL_MODELVIEW);                        //选择模型矩阵
    glLoadIdentity();

三、解决过程记录

3.1 定位问题

  • 同步在Windows和Linux调试,发现透视投影矩阵的值不同。左边是Linux下的,值明显有问题在这里插入图片描述 在这里插入图片描述
  • 不同系统下,同一句代码 产生了不同的矩阵?Linux下resizeGL(int w, int h)中使用如下代码获取设定的矩阵值,没问题
    GLdouble projmatrix[16];
    glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
  • 继续Debug,怀疑是运行到某个语句,矩阵值被改变了…在paintGL()中很多语句后增加投影矩阵值的打印,直接放结果 (在painter.beginNativePainting()后值被改变):
    在这里插入图片描述
  • 与 painter.beginNativePainting();冲突?

3.2 解决问题,深入分析

  • painter.beginNativePainting();后重新赋值投影矩阵即可… 详情看之前的解决方案
  • 但是painter.beginNativePainting()究竟干了什么? 将原点设置到了窗口左上角吗?之前Linux下OpenGL程序窗口左上角好像真的有闪烁

如何使原始坐标(0,0)位于QGLWIdget的左上角?http://cn.voidcc.com/question/p-ncxvwltv-bau.html

  • 查看官方文档,也未曾提及… 看到这句 The states we reset may change from release to release. 也可能这个版本真的重置了投影矩阵…
    在这里插入图片描述

翻译:
刷新绘制管道,并为用户直接向底层图形上下文发出命令做准备。必须后跟endNativePainting()的调用。
请注意,只有基础绘制引擎更改的状态才会重置为各自的默认状态。我们重置的状态可能会随着发布而变化。以下状态当前在OpenGL 2引擎中重置:

  • 禁用混合
  • 深度、模板和剪刀测试被禁用
  • 活动纹理单位重置为0
  • 深度遮罩、深度函数和清除深度将重置为默认值
  • 模具掩码、模具操作和模具函数将重置为默认值
  • 当前颜色重置为纯白色

例如,如果用户在beginNativePaint() / endNativePainting() 块内更改OpenGL多边形模式,则endNativePaiuting() 不会将其重置为默认状态。

  • 也有可能是Linux下OpenGL版本问题… 或者是Qt版本问题… 未曾更换版本,也未曾看过源码,不确定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】动态规划法解题20240227

动态规划法 一、什么是动态规划二、动态规划的解题步骤三、509. 斐波那契数1、动规五部曲: 四、70. 爬楼梯1、动规五部曲: 五、746. 使用最小花费爬楼梯1、动规五部曲: 一、什么是动态规划 动态规划,英文:Dynamic Pro…

23年中科院1区算法|长鼻浣熊优化算法COA原理及其利用与改进(Matlab/Python)

文章来源于我的个人公众号:KAU的云实验台,主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文 KAU将介绍一个2023年1月发表在中科院1区KBS上的优化算法——长鼻浣熊优化算法(Coati Optimization Algorithm,COA)[1] 该算法由Dehg…

SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制

文章目录 前言10.5 声明式事务的传播行为控制10.5.1 修改测试代码(1)新建一个Service类,并引用UserService(2)修改主启动类 10.5.2 PROPAGATION_REQUIRED10.5.2.1 tm.getTransaction(1)获取事务…

IO进程线程作业day7

信号灯集共享内存 自定义头文件 #ifndef SEM_H_ #define SEM_H_ //创建信号灯集, int creat_t(int number); //申请释放资源 int P(int semid,int semno); //申请释放资源 int V(int semid,int semno); //删除信号灯集 int del(int semid); #endif信号灯集函数集合 #include…

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

基于 ResNet50和 SVM + 决策树的人脸口罩检测

欢迎收看,这篇文章是关于我如何使用 ResNet50作为特征提取器来构建掩码检测,然后使用支持向量机(SVM) 决策树和叠加集成方法作为分类器的一个快速解释。 为了向研究人员致敬,这个应用程序是基于研究论文,题目是“在2019冠状病毒…

分布式应用:kylin 部署 zabbix 监控平台

目录 一、实验 1.环境 2. kylin 修改mysql数据库 3. kylin 部署 zabbix 监控平台 4. kylin 修改 zabbix 配置 5. kylin 修改zabbix web 二、问题 1. zabbix_server 查看版本报错 2.zabbix_server 文件如何去掉注释"#"和空行 3. zabbix图表显示异常 4.zabbi…

前端常见面试题之vue3

文章目录 1. vue3比vue2有哪些优势2. 描述vue3的生命周期3. 如何看待vue3中的Composition API 和 Options API4. 如何理解ref、 toRef、和toRefs?5. vue3升级了哪些功能6. Composition API如何实现代码逻辑的复用(hook)7. Vue3如何实现响应式的8.Vue3使用Proxy对象…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同,但是参数列表不同的方法 参数列表不同是指: 形参类型形参个数形参顺序 面向对象 field —— …

linux系统---防火墙拓展

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 4.白名单 5.通用匹配 6.示例 6.1添加回环网卡 6.2可以访问端口 6.3 主…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式(1)分而治之(2)迭代式设计 3、架构设计的输入(1)概览(2)功能需求 - WH分析法(3)质量 - “怎么”分…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 故事 新年新气象,小猫也是踏上了新年新征程,自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后,小猫对整个系统的把控可谓又是上到可一个新的高度。…

Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python

不知道什么仙人设计的arduino连接网络部分,死活下不下来。(真的沙口,第一次看到这么抽风的下载口) 操作 给爷惹火了我踏马解析json选zip直接全部下下来 把这个大家的开发板管理地址下下来跟后面python放在同一目录下&#xff0c…

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现,本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…

理解这几个安全漏洞,你也能做安全测试!

如今安全问题显得越来越重要,一个大型的互联网站点,你如果每天查看日志,会发现有很多尝试攻击性的脚本。 如果没有,证明网站影响力还不够大。信息一体化的背后深藏着各类安全隐患,例如由于开发人员的不严谨导致为Web应…

基于24扇区细分的三电平逆变器异步电机直接转矩控制系统学习

导读:本期文章介绍异步电机三电平24扇区的直接转矩控制。三电平逆变器直接转矩控制中,传统的PWM控制方法存在错判区间等问题。本文在借鉴三电平逆变器单一矢量及合成矢量的直接转矩控制研究和两电平12扇区直接转矩控制的基础上,将两电平12扇区…

堆/堆排序(C/C++)

本篇文章将会较为全面的介绍堆的概念以及实现堆两个重要算法:向上调整算法和向下调整算法。接着实现了堆排序。 若想查看对应位置,可直接按照以下目录进行查看: 目录 1.堆的概念及结构 2.堆的实现 2.1 堆的向上调整算法 2.2 堆的向下调整算法…

beego代理前端web的bug

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、beego代理前端web的bug总结 一、beego代理前端web的bug *报错,为web压缩包index.html里面的注释被错误解析,删掉就行 2024/02/22 10:2…

解析Hadoop三大核心组件:HDFS、MapReduce和YARN

目录 HadoopHadoop的优势 Hadoop的组成HDFS架构设计Yarn架构设计MapReduce架构设计 总结 在大数据时代,Hadoop作为一种开源的分布式计算框架,已经成为处理大规模数据的首选工具。它采用了分布式存储和计算的方式,能够高效地处理海量数据。Had…

蛇形矩阵1

题目描述 把数1,2,3,…,N*N按照“蛇形1”放入N*N的矩形中,输出结果。 下面是N10的蛇形1的图示 输入格式 第一行1个正整数:N,范围在[1,100]。 输出格式 N行,每行N个整数。 输入/…