OpenGL的学习之路

Qt如何创建OpenGL的渲染窗口?

类比GLFW库,Qt提供了OpenGL的渲染窗口类QOpenGLWidget:

1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。

2、重写paintGL()来绘制3D场景,只调用OpenGL函数。

3、还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象(注意QPainter没调用OpenGL渲染)。

Qt如何实现OpenGL函数绑定?

类比GLAD库,Qt不直接调用OpenGL函数,而是通过QOpenGLFunctions这一实例来进行函数调用,这种调用方法主要有以下两种:

1、直接从OpenGLContext::functions()中获取

 QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

2、继承QOpenGLFunctions

 class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions{...void initializeGL() override{initializeOpenGLFunctions();glClearColor(...);...}...};

示例代码:

1、创建MyOpenGLWidget.h

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H#include <QtOpenGLWidgets/QtOpenGLWidgets>class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:MyOpenGLWidget();
protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;
};#endif // MYOPENGLWIDGET_H

2、创建MyOpenGLWidget.cpp

#include "myopenglwidget.h"MyOpenGLWidget::MyOpenGLWidget() {//设置上下文属性QSurfaceFormat format;format.setDepthBufferSize(24);format.setStencilBufferSize(8);format.setVersion(3, 3); //OpenGL 版本号3.3format.setProfile(QSurfaceFormat::CoreProfile);// 核心模式this->setFormat(format);
}void MyOpenGLWidget::initializeGL(){//绑定OpenGL函数指针?类似GLAD库的作用?initializeOpenGLFunctions();
}void MyOpenGLWidget::paintGL(){//由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
}void MyOpenGLWidget::resizeGL(int w, int h){}

3、调用MyOpenGLWidget类

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{_myOpenGLWidget = new MyOpenGLWidget;this->setCentralWidget(_myOpenGLWidget);//设置窗口大小this->setGeometry(0,0,800,600);
}MainWindow::~MainWindow() {if(_myOpenGLWidget)delete _myOpenGLWidget;
}

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

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

相关文章

python 基础综合应用——小开发

#python 基础综合应用——小开发 综合复习 变量- 循环- 函数- 模块 开发 名片管理系统 名片管理系统介绍 名片管理系统可以理解成花名册软件&#xff0c;通过个人新建人的信息后可以进行查询等简单操作的程序 名片管理系统有三个作用&#xff0c; 1.新建名片 2.显示全部名…

【设计模式】装饰者模式里Java实现

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

【VIM的使用】

Vim 是一个非常强大的文本编辑器&#xff0c;尤其在 Linux 环境下被广泛使用。它基于 vi 编辑器开发而来&#xff0c;增加了许多功能和改进。下面是一个简化的 Vim 教程&#xff0c;帮助你快速上手&#xff1a; 启动 Vim 要启动 Vim&#xff0c;只需在终端中输入 vim [filen…

Leetcode刷题2---两数相加 Python

目录 题目及分析解法一: 迭代法解法二: 递归法解法三&#xff1a;反转链表法 题目及分析 &#xff08;力扣序号2&#xff1a;两数相加&#xff09; 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储…

python之音频处理(2)两个音频文件的合并

from pydub import AudioSegment# 加载两个音频文件 audio1 AudioSegment.from_file(r"D:\websiteDownload\huanxing.wav") audio2 AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很烦.wav")# 设置间隔&#xff08;单位&#xff1a;…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中&#xff0c;PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件&#xff0c;其提供的先进布局工具&#xff0c;无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中&#xff0c;Alti…

初学Spring之自动装配 Bean

Bean 的作用域&#xff1a; 1.单例模式&#xff08;Spring 默认机制&#xff09; scope“singleton” 2.原型模式&#xff1a;每次从容器中 get 时&#xff0c;都会产生一个新对象 scope"prototype" 3. request、session、application&#xff0c;只能在 web 开…

《c语言结构体怎么函数传参》

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;用于组合多个不同类型的数据成员。当你要将结构体作为参数传递给函数时&#xff0c;可以按照以下几种方式进行&#xff1a; 值传递&#xff08;Pass by Value&#xff09;&a…

【pytorch扩展】CUDA自定义pytorch算子(简单demo入手)

Pytorch作为一款优秀的AI开发平台&#xff0c;提供了完备的自定义算子的规范。我们用torch开发时&#xff0c;经常会因为现有算子的不足限制我们idea的迸发。于是&#xff0c;CUDA/C自定义pytorch算子是不得不磕了。 今天通过一个小实验来梳理自定义pytorch算子都需要做哪些准…

软设之类的继承与泛化,多重继承

在类中&#xff0c;假如父类已经写好属性或方法&#xff0c;子类想要实现相同的功能&#xff0c;不用专门写代码&#xff0c;直接用专门的继承语言继承就可以了。 比如说有一个动物类&#xff0c;有毛色和叫这两个属性和方法&#xff0c;又写了一个子类是猫类&#xff0c;猫类…

腾讯云COS分布式对象存储

腾讯云COS分布式对象存储 腾讯云对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种用于存储海量文件的分布式存储服务。 腾讯云 COS 适用于多种场景&#xff0c;如静态网站托管、大规模数据备份和归档、多媒体存储和处理、移动应用数据存…

Kafka搭建(单机版)

部署前提 VMware环境 : 两台centos系统 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度网盘自取: 链接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取码: e32t Kafka搭建&#xff08;…

Camtasia 2024新功能 Camtasia2024更新介绍:AI剪辑助力微课制作 Camtasia2024密钥 Camtasia2023免费升级更新

Camtasia 是一款功能强大的屏幕录制和视频编辑软件&#xff0c;广泛应用于教育、商业和娱乐领域。无论是创建教学视频、产品演示、教程还是营销内容&#xff0c;Camtasia都能提供专业的工具和功能&#xff0c;帮助用户制作高质量的视频内容。 Camtasia 2024 中文免费安装包百度…

暑假学习DevEco Studio第2天

学习目标&#xff1a; 掌握页面跳转 学习内容&#xff1a; 跳转页面 创建页面&#xff1a; 在“project”窗口。打开“entry>src>main>ets”,右击“pages”&#xff0c;选择“New>ArkTS File”,命名“Second”&#xff0c;点击回车键。 在页面的路由&#xff0…

昇思25天学习打卡营第16天|文本解码原理——以MindNLP为例

在大模型中&#xff0c;文本解码通常是指在自然语言处理&#xff08;NLP&#xff09;任务中使用的大型神经网络模型&#xff08;如Transformer架构的模型&#xff09;将编码后的文本数据转换回可读的原始文本的过程。这些模型在处理自然语言时&#xff0c;首先将输入文本&#…

【Unix/Linux】Unix/Linux如何查看系统版本

Unix和Linux查看系统版本的指令有些区别&#xff0c;下面分别介绍: 一.Unix查看系统版本 在Unix系统中&#xff0c;查看系统版本的方法可能会根据具体的Unix操作系统而有所不同。以下是一些通用的方法&#xff0c;适用于多种Unix系统&#xff0c;包括但不限于Solaris、AIX、H…

vienna整流器过零畸变原因分析

Vienna整流器是一种常见的三电平功率因数校正&#xff08;PFC&#xff09;整流器&#xff0c;广泛应用于电源和电能质量控制领域。由于其高效率、高功率密度和低谐波失真的特点&#xff0c;Vienna整流器在工业和电力电子应用中具有重要地位。然而&#xff0c;在实际应用中&…

ssh:(xshell)远程连接失败

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 云服务器远程连接失败 xshell 远程连接失败 xshell (ssh客户端&#xff09; ---------------------------------------------安全组----------防火墙-------黑白名单-----SSH服务 问题排查 1. 安全…

Playwright之录制脚本转Page Object类

Playwright之录制脚本转Page Object类 设计思路 &#xff1a; 我们今天UI自动化设计的时候&#xff0c;通常会遵循一些设计模式&#xff0c;例如Page Object模式。但是自己找元素再去填写有一些麻烦&#xff0c;所以我们可以通过拆解录制的脚本&#xff0c;将其中的元素提取出来…

DALL-E、Stable Diffusion 等 20+ 图像生成模型综述

二、任务场景 2.1. 无条件生成 无条件生成是指生成模型在生成图像时不受任何额外条件或约束的影响。模型从学习的数据分布中生成图像&#xff0c;而不需要关注输入条件。 2.2. 有条件生成 有条件生成是指生成模型在生成图像时受到额外条件或上下文的影响。这些条件可以是类别…