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版本问题… 未曾更换版本,也未曾看过源码,不确定

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

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

相关文章

告别枯燥代码,Matplotlib学习网站让图表活起来!

介绍:Matplotlib是一个广泛使用的Python绘图库,专门用于创建高质量的2D图形。 Matplotlib的特点包括: 丰富的图表类型:支持多种图表类型,如线图、散点图、柱状图、直方图等,满足不同的数据可视化需求。 高度…

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎,又名In-place Update存储引擎(原地更新&#xff09…

芯来芯片的硬件的栈溢出检测机制(Stack Check)介绍

1、发生栈溢出上报的中断号 发生栈上溢,上报中断号0x18;发生栈下溢,上报终端号0x19; 2、栈溢出控制寄存器 1、MODE位设置为0,选择栈的上溢和下溢检查模式; 2、使能栈上溢检查和栈下溢检查; 3、设…

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据,包括地标(Landmark)、特征点(Feature Point)、平面(Plane)等,以及使用者的操作信息,如使用者添加的 ARAnchor …

FreeRTOS 的队列基础API函数的使用

参考教程来源 //* 实验平台:启明欣欣 STM32F407应用开发板(高配版) 参考正点原子 #include "freertos_demo.h" #include "./SYSTEM/usart/usart.h" #include "led.h" #include "lcd.h" #include "key.h"/*FreeRTOS*********…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机沿自定义8字形轨迹正向飞行(带偏航角控制)并在Gazebo中可视化

在Simulink中使用ROS2控制无人机沿自定义8字形轨迹正向飞行(带偏航角控制)并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模…

Prompt 编程的优化技巧

一、为什么要优化 一)上下文限制 目前 GPT-3.5 以及 GPT-4最大支持 16K 上下文,比如你输入超过 16k 的长文本,ChatGPT 会提示文本过大,为了避免 GPT 无法回复,需要限制 上下文在16k 以内 上下文对于 GPT 来说是非常重…

Maven jar 的查找及依赖版本确定

关于 jar 的查找,及使用版本的确定,及依赖的版本确认,避免 jar 冲突或版本不兼容 在使用 maven 构建项目时,需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖,这里以查找 mybatis 依赖为例&…

042 继承

代码实现 首先定义Person类(人类) /*** 人的基础特征** author Admin*/ public class Person {/*** 姓名*/String name;/*** 生日*/Date birthday;/*** 手机号码*/String tel;/*** 身份证号码*/String idCode;public Person() {}public Person(String …

微服务基础环境搭建

一.创建父工程 用于聚合其他微服务模块 1 新建 Maven 项目 JDK8Maven 项目Web 2 项目设置 编码的选择 UTF8JDK 版本的选择 3 删除 src 目录 4 配置父级 pom.xml SpringBoot:模块探究之spring-boot-dependencies-CSDN博客 子模块能够依赖当前父级 pom.xml 配置 【My…

【LLM入门实践】简便快捷获取Hugging Face模型

前言 好久没有更新博客了,由于AI 大模型技术经过2023年的狂飙,2024年迎来大量的应用的落地,作为一个技术人,我也对此有了浓厚的兴趣,买了很多本书,然后试图找到一个学习大模型的速成模式,遗憾的…