【OpenGL】 理解makeCurrent函数

news/2024/9/19 4:45:24/ 标签: OPenGl, Qt

背景

用QT学校OpenGL绝对可以事半功倍,QT提供了一系列对OpenGL的支持,包括OPenGL窗口类,对OpenGL函数的面向对象的封装等。

总体说明

Qt框架中,makeCurrentQOpenGLContext类的一个方法,它封装了这些平台特定的调用,提供了一个跨平台的接口来管理OpenGL上下文。makeCurrent函数的作用是将一个特定的OpenGL上下文(context)设置为当前线程的渲染上下文。这意味着,当你调用OpenGL函数进行绘制时,这些函数将操作这个指定的上下文。每个OpenGL上下文包含了一整套OpenGL的状态信息,比如纹理绑定、帧缓冲对象(FBO)的配置等。

当你创建一个OpenGL窗口或帧缓冲对象时,通常会与一个上下文对象关联。在进行绘制之前,你需要通过makeCurrent函数来激活这个上下文,这样OpenGL的命令就会作用于这个上下文。在Qt中,如果你继承了QOpenGLWidget并重写了initializeGLresizeGLpaintGL函数,那么在这些函数中你不需要手动调用makeCurrent,因为这些函数被调用时,Qt会自动将你的QOpenGLWidget的上下文设置为当前上下文。

在某些情况下,如果你需要在这些虚函数之外的地方进行OpenGL绘制,那么你需要手动调用makeCurrent来激活上下文。例如,在QOpenGLWidget的构造函数或析构函数中,如果你需要创建或销毁OpenGL资源,你应该首先调用makeCurrent,然后进行资源的创建或销毁,最后调用doneCurrent来释放当前的上下文。

在多线程环境中,每个线程可以有自己的当前上下文,但是一个上下文在同一时间只能被一个线程设置为当前。如果你尝试在不同的线程中使用同一个上下文,可能会导致不可预测的行为或程序崩溃。

总结来说,makeCurrent函数是OpenGL编程中用于管理上下文状态的关键函数,它确保了OpenGL命令能够正确地应用于你想要操作的特定上下文。

makeCurrent 如何实上下文现切换?

这个上下文应该指的就是线程中,声明的一些变量。QT的 QOpenGLWidget并重写了initializeGLresizeGLpaintGL函数,本身就是在当前的创建的OpenGL线程里面, 所以,不存在切换。
但是,如果你在其他地方调用OpenGL的函数。就是在其他线程里面,
上下文就不一样(不是同一个线程)。你需要将QOpenGLWidget的上下文通过moveToThread转移到该线程,并手动调用makeCurrent()和doneCurrent()来管理上下文的当前状态。
我觉得理解到这里,就可以了,就不会觉得调用这个函数奇怪了。


当然你还想继续探究,可以看看下面这段总结:

makeCurrent 函数的实现细节依赖于操作系统和OpenGL的实现,但通常它涉及到以下几个步骤:

  1. 激活上下文makeCurrent 函数首先会激活(或“使当前”)一个特定的OpenGL上下文。这通常涉及到与操作系统的API调用,以确保所有后续的OpenGL命令都指向这个上下文。

  2. 线程局部存储:OpenGL上下文通常与一个线程关联。makeCurrent 可能会使用线程局部存储(Thread Local Storage, TLS)来存储当前线程的OpenGL上下文指针。这样,当OpenGL命令被调用时,它们可以查找TLS来找到当前激活的上下文。

  3. 资源绑定:在上下文被激活后,所有与之前上下文相关的资源绑定(如纹理、缓冲区、帧缓冲等)都会被解绑,以便新的上下文可以绑定它自己的资源。

  4. 状态切换:操作系统或OpenGL的实现会负责更新内部状态,以确保OpenGL的状态机反映了新上下文的状态。这可能包括切换GPU的渲染目标、更新GPU的管线状态等。

  5. 错误处理:如果尝试激活的上下文无效或与当前线程不兼容,makeCurrent 函数会返回错误。在某些实现中,这可能涉及到检查上下文是否已经与另一个线程绑定,或者是否与当前的设备上下文(如Windows中的HDC)不匹配。

在不同的平台上,makeCurrent 函数的具体实现可能会有所不同:

  • Windows:在Windows平台上,makeCurrent 可能会调用Win32 API wglMakeCurrent,它接受一个设备上下文(HDC)和一个渲染上下文(HGLRC)作为参数。

  • macOS:在macOS上,makeCurrent 可能会使用NSOpenGL API,如[NSOpenGLContext makeCurrentContext:]

  • Linux/X11:在Linux上,可能会使用GLX API,如glXMakeCurrent

  • EGL:对于使用EGL的嵌入式系统或某些现代OpenGL ES实现,makeCurrent 可能会调用eglMakeCurrent,它接受显示(EGLDisplay)、绘制表面(EGLSurface)和上下文(EGLContext)作为参数。

Qt框架中,makeCurrentQOpenGLContext类的一个方法,它封装了这些平台特定的调用,提供了一个跨平台的接口来管理OpenGL上下文。当你调用makeCurrent时,Qt会负责处理所有底层的切换逻辑。


http://www.ppmy.cn/news/1521000.html

相关文章

CSS解析:盒模型

在网页上实现元素布局涉及很多技术。在复杂网站上,可能会用到浮动元素、绝对定位元素以及其他各种大小的元素,甚至也会使用较新的CSS特性,比如Flexbox或者网格布局。 在此之前我们要打好基础,深刻理解浏览器是如何设置元素的大小…

Update Azure OpenAI npm Package to 2023-12-01-preview Version

题意:将 Azure OpenAI npm 包更新到 2023-12-01-preview 版本 问题背景: I am currently using the azure-openai npm package in my project with version 2023-03-15-preview. As per the latest updates, version 2023-12-01-preview is available a…

使用 SCSS 或 LESS 相比于纯 CSS 的好处

使用 SCSS 或 LESS 相比于纯 CSS 有以下几个好处: 变量支持: SCSS/LESS:可以定义变量用于存储颜色、字体大小、间距等值,便于在整个样式文件中复用。例如,可以定义一个颜色变量 $primary-color: #3498db;,然…

网站维护更新简易单页404页html代码

源码介绍 一个简约风格的单页html页面,可用于网站维护中或更新网站时挂个首页使用,如果不喜欢现在的颜色请F12修改设置既可。 效果预览 源码获取 网站维护更新简易单页404页html代码

数据分析利器:Java与MySQL构建强大的数据挖掘系统

数据分析在当今信息时代具有重要的作用,它可以帮助企业和组织深入理解数据,发现隐藏在数据中的模式和规律,并基于这些洞察进行决策和优化。Java与MySQL作为两个强大的工具,结合起来可以构建出一个高效、可靠且功能丰富的数据挖掘系…

在Ubuntu 16.04上安装Nginx的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 Nginx 是世界上最流行的 Web 服务器之一,负责托管一些互联网上最大和最高流量的网站。在大多数情况下,它比…

杭州网站建设网页手机版

杭州作为中国的电子商务之都,网站建设在杭州可谓是异常繁荣。随着移动互联网的兴起,越来越多的企业开始注重网页的手机版建设,以满足用户在移动设备上的浏览需求。杭州网站建设公司也专门针对手机版网页进行优化,提供更好的用户体…

Git 使用指南 --- 版本管理

序言 Git 是一个开源的 分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。  在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。…

【UEFI基础】SMBIOS基础和使用

SMBIOS的定义 SMBIOS的全称是System Management BIOS,关于它的理解包括: 它不是一个BIOS,之所以出现了BIOS字样,是因为它跟BIOS有关,仅此而已。它是一个规范,定义了BIOS传递给操作系统的系统管理信息&…

java整合Redission

1.maven仓库查询Redisson并倒入项目 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.35.0</version> </dependency> 2.配置文件&#xff08;采用yml配置方式&…

并发和并行的关系

先说结论&#xff0c;并发、并行并不对立&#xff0c;可同时存在。 什么是并发&#xff1f; CPU运行速度远大于内存读取速度&#xff0c;为了充分利用CPU性能&#xff0c;不让它总是等着从内存里读数据&#xff0c;CPU时间片技术应运而生&#xff0c;可分时复用CPU&#xff0c…

Linux——redis理论、安全模型

一、redis 主要的data type redis 的原生客户端redis 支持通过python php golang 等语言连接redis 主要适用场景 二、redis如何进行数据存储 非关系数据库 不使用二维表 redis 使用键值对完成数据的存储redis一共有16个库 &#xff0c;不同的库使用编号 0-15redis 在…

LED深圳标准认证产品发布会将在泰国LED展同期举行

9月5-7日&#xff0c;2024泰国曼谷LED照明产品及技术展LED EXPO THAILAND将在IMPACT展览中心盛大召开。深圳市照明与显示工程行业协会将组织立洋股份、亿鑫越、飞业泰、崧盛电子等企业以深圳标准认证展团的方式集团亮相本次展会&#xff0c;并同期召开LED深圳标准认证产品全球发…

Python集成学习和随机森林算法使用详解

概要 集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它通过将多个弱学习器的结果结合起来,形成一个强学习器,从而提升模型的准确性和稳健性。随机森林(Random Forest)是集成学习中一种非常流行且有效的算法,特别适用于分类和回归任务。本文将详细介绍Pyt…

安装Android Studio及第一个Android工程可能遇到的问题

Android Studio版本众多&#xff0c;电脑操作系统、电脑型号、电脑硬件也是多种多样&#xff0c;幸运的半个小时内可以完成安装&#xff0c;碰到不兼容的电脑&#xff0c;一天甚至更长时间都无法安装成功。 Android安装及第一个Android工程分为4个步骤&#xff0c;为什么放到一…

龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

BUUCTF—[BJDCTF2020]The mystery of ip

题解 打开环境点击上面的flag可以看到这个IP页面。 抓个包看看有啥东西无&#xff0c;可以看到在返回包有IP。 看到IP就想到X-Forwarded-For这个玩意&#xff0c;我们用X-Forwarded-For随便添加个IP看看。可以看到返回的IP内容变成了123。 X-Forwarded-For:123 推测它会输出我…

[数据集][目标检测]汽油检泄漏检测数据集VOC+YOLO格式237张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;237 标注数量(xml文件个数)&#xff1a;237 标注数量(txt文件个数)&#xff1a;237 标注类别…

12. GIS地图制图工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

25版王道数据结构课后习题详细分析 第七章 7.4 B树和B+树

一、单项选择题 ———————————————————— ———————————————————— 解析&#xff1a;关键字数目比子树数目少1&#xff0c;首先可排除B树。对于4阶B树&#xff0c;根结点至少有⒉棵子树(关键字数至少为1)&#xff0c;其他非叶结点至少有n/…