glfwWindowHint、glfwCreateWindow、上下文对象共享之间的关系

server/2024/12/24 10:19:35/

        理解 创建窗口HINT、创建窗口 和 上下文对象共享 之间的关系,首先需要了解这三个概念如何在 GLFW 中一起工作。以下是它们之间关系的详细解释:

1. 创建窗口HINT(Window Hints)

        glfwWindowHint 用于设置窗口和上下文的创建提示。提示告诉 GLFW 在创建窗口时应如何配置窗口及其 OpenGL/ES 上下文。这些提示通常在调用 glfwCreateWindow 之前设置。

        例如,你可以通过 glfwWindowHint 设置:

  • 窗口的颜色位深度(例如:GLFW_RED_BITS、GLFW_GREEN_BITS 等)
  • 是否使用 OpenGL 的核心配置文件(例如:GLFW_OPENGL_PROFILE)
  • 是否支持抗锯齿(例如:GLFW_SAMPLES)
  • 窗口的默认大小等

        这些设置会影响窗口的创建,并在调用 glfwCreateWindow 时生效。

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置 OpenGL 主版本为 3 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置 OpenGL 次版本为 3 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用核心配置文件

2. 创建窗口(glfwCreateWindow)

        glfwCreateWindow 是实际创建窗口和 OpenGL/ES 上下文的函数。这个函数使用你在之前通过 glfwWindowHint 设置的提示来创建窗口和上下文。你可以在 glfwCreateWindow 中指定窗口的大小、标题以及它是否应该为全屏模式。

        这个函数的关键是,你必须先通过 glfwWindowHint 配置好所有的窗口提示,之后再调用 glfwCreateWindow 来创建窗口和上下文。

GLFWwindow* window = glfwCreateWindow(800, 600, "My Window", NULL, NULL); if (!window) { // 错误处理 }

3. 上下文对象共享(Context Object Sharing)

        上下文对象共享是指,多个 OpenGL 上下文可以共享资源(如纹理、缓冲区等)。在 GLFW 中,通过 glfwCreateWindow 创建窗口时,你可以指定另一个窗口的上下文作为共享对象。这样,两个窗口的上下文就可以共享它们的 OpenGL 资源,例如纹理、着色器、缓冲区等。

        这通常用于需要多个窗口的应用程序(例如,多视图渲染),你希望这些窗口之间能够共享一些资源而不需要复制它们。

示例代码:

GLFWwindow* first_window = glfwCreateWindow(800, 600, "First Window", NULL, NULL); 
GLFWwindow* second_window = glfwCreateWindow(640, 480, "Second Window", NULL, first_window);

        在上面的例子中,first_window 和 second_window 会共享 OpenGL 上下文中的资源。也就是说,第二个窗口的 OpenGL 上下文会和第一个窗口共享纹理、缓冲区等资源。

注意:

        共享上下文的窗口必须是同一个线程上的操作。如果一个上下文已经被设为当前上下文(即它正被使用),那么它就不能在另一个线程中共享,必须确保它在同一线程上进行操作。

它们之间的关系:

  • glfwWindowHint

        用于设置创建窗口时的一些配置选项,比如 OpenGL 的版本、窗口的大小、是否为全屏等。这些提示会影响你后续调用 glfwCreateWindow 创建的窗口和上下文。

  • glfwCreateWindow

        实际上是创建窗口的函数,在这个函数中你会传入已经通过 glfwWindowHint 设置的窗口提示来创建具体的窗口及其 OpenGL 上下文。

        见文档:为什么glfwWindowHint设置的属性,glfwCreateWindow可以直接使用?-CSDN博客

  • 上下文对象共享

        通过在创建窗口时,将另一个窗口的上下文作为共享上下文传入实现。这样,两个窗口的 OpenGL 上下文就可以共享对象(比如纹理、缓冲区等),这在需要多个窗口之间共享资源时非常有用。

总结:

  1. glfwWindowHint 是用来设置窗口和上下文的一些属性和选项的。
  2. glfwCreateWindow 是创建窗口的实际函数,它会根据你之前设置的 glfwWindowHint 来创建窗口和上下文。
  3. 上下文对象共享 允许多个窗口共享 OpenGL 上下文中的资源。通过在创建第二个窗口时将第一个窗口的上下文作为参数传入来实现。

http://www.ppmy.cn/server/152748.html

相关文章

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器: 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

DG常用启动方法与异常查找

--查看主库的状态: select a.inst_id,a.db_unique_name,a.database_role, a.protection_level,a.protection_mode,a.open_mode,a.log_mode,a.switchover_status, b.host_name,b.thread# from gv$database a left join gv$instance b on a.inst_idb.inst_id order by…

Redisson分布式锁的源码解读

之前秒杀项目中就用到了这个 Redisson 分布式锁 &#x1f447;&#xff0c;这篇就一起来看看源码吧&#xff01; tryLock 加锁 流程 // RedissonLock.java Override public boolean tryLock() {return get(tryLockAsync()); }Override public RFuture<Boolean> tryLockAs…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

【深入解析蓝牙dumpsys bluetooth_manager 命令输出】

了解蓝牙的工作状态以及如何在测试中利用这些信息。 1. Bluetooth Status(蓝牙状态) enabled: true state: ON address: 00:00:00:00:43:36 name: 小米手机 time since enabled: 00:15:18.492enabled: true — 蓝牙功能已启用。state: ON — 蓝牙目前是开启状态。address: …

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…

【linux 常用命令】

1. 使用xshell 通过SSH连接到Linux服务器 ssh -p 端口号 usernameip地址2. 查看当前目录下的子文件夹的内存占用情况 du -a -h -d 1或者 du -ah -d 1-a &#xff1a;展示所有子文件夹&#xff08;包括隐藏文件夹&#xff09;&#xff0c;-h &#xff1a;以人类可读的形式&am…