为什么glfwWindowHint设置的属性,glfwCreateWindow可以直接使用?

**glfwWindowHint 设置的属性是全局的,但它们的作用范围仅限于紧随其后的 glfwCreateWindow 调用。**也就是说,glfwWindowHint 的设置会影响你在设置后调用的每个 glfwCreateWindow 函数,而不会直接影响之前创建的窗口。

1. glfwWindowHint 是全局设置

glfwWindowHint 用来设置 GLFW 库在创建窗口时的一些全局参数。这些参数是针对下一次窗口创建的,因此你每次调用 glfwCreateWindow 时,GLFW 都会使用最后一次设置的提示来创建新的窗口。

具体来说,当你调用 glfwWindowHint 设置某个属性时,它会"告诉"GLFW,下一次创建窗口时应该使用该属性。然而,它不会影响已经创建的窗口。每次调用 glfwCreateWindow 时,GLFW 会根据这些提示创建一个新的窗口,应用这些提示。

2. 如何知道这些设置是针对自己的窗口的?

虽然 glfwWindowHint 是全局设置,但它只会影响紧跟着它的那个 glfwCreateWindow 调用。这意味着,在每次调用 glfwCreateWindow 时,GLFW 会根据你最后一次调用 glfwWindowHint 的设置来创建窗口。因此,每次调用 glfwCreateWindow 时,设置会被应用到该窗口,且窗口是独立创建的。

举个例子:

假设你有两个窗口,并且想要分别设置每个窗口的 OpenGL 版本和其他属性:

cpp 复制代码
// 设置第一个窗口的提示(例如 OpenGL 版本)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
// 设置 OpenGL 主版本为 3 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// 设置 OpenGL 次版本为 3 

GLFWwindow* window1 = glfwCreateWindow(800, 600, "Window 1", NULL, NULL); 
// 设置第二个窗口的提示(例如不同的 OpenGL 版本) glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 设置 OpenGL 主版本为 4 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); // 设置 OpenGL 次版本为 5 
GLFWwindow* window2 = glfwCreateWindow(800, 600, "Window 2", NULL, NULL);
  • 对于 window1:它会使用在 glfwWindowHint 中设置的 OpenGL 版本(3.3)。这些设置会影响 glfwCreateWindow 的行为,创建一个 3.3 版本的 OpenGL 上下文。
  • 对于 window2:当你调用 glfwCreateWindow 创建 window2 时,GLFW 会根据最后一次设置的提示(OpenGL 4.5)来创建窗口和上下文。

3. 多个窗口的提示行为

如果你想给不同的窗口设置不同的提示,你需要确保每个窗口的 glfwWindowHint 设置发生在对应的 glfwCreateWindow 调用之前。如果在创建窗口之前没有改变提示,那么下一个 glfwCreateWindow 就会使用最新的提示值。

示例:

cpp 复制代码
// 设置第一个窗口的提示
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
GLFWwindow* window1 = glfwCreateWindow(800, 600, "First Window", NULL, NULL);

// 设置第二个窗口的提示
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
GLFWwindow* window2 = glfwCreateWindow(800, 600, "Second Window", NULL, NULL);

在这个例子中,window1 会使用 OpenGL 3.2,而 window2 会使用 OpenGL 4.5,因为提示是为每次窗口创建单独配置的。

4. 上下文共享(Context Sharing)

对于 上下文共享(glfwCreateWindow 的 share 参数),这个设置不是通过 glfwWindowHint 来控制的,而是在调用 glfwCreateWindow 时,通过 share 参数来指定。你可以将一个窗口的上下文作为参数传递给另一个窗口,从而使两个窗口共享 OpenGL 资源(如纹理、缓冲区等)。

例如,以下代码创建了两个窗口,第二个窗口会与第一个窗口共享 OpenGL 上下文中的资源:

cpp 复制代码
GLFWwindow* window1 = glfwCreateWindow(800, 600, "First Window", NULL, NULL);
GLFWwindow* window2 = glfwCreateWindow(640, 480, "Second Window", NULL, window1); // 第二个窗口与第一个窗口共享资源

总结:

  • glfwWindowHint 是全局设置,它会影响接下来的 glfwCreateWindow 调用。
  • glfwCreateWindow 创建新窗口时,使用的是 最后一次调用 glfwWindowHint 设置的提示。
  • 每次创建窗口时,glfwWindowHint 设置的参数会影响当前窗口的属性。
  • 上下文共享 是在调用 glfwCreateWindow 时,通过 share 参数来实现的,并不通过 glfwWindowHint 设置。
相关推荐
BigTopOne5 小时前
【WebRtc】DTLS-SRTP 加密完整流程详解
前端
陈随易5 小时前
pm2 替代品,nodejs&bun 线上部署必备工具
前端·后端·程序员
Nontee5 小时前
MySQL 插入冲突了怎么办?两种处理方式入门笔记
数据库·笔记·mysql
单线程_015 小时前
从案例分析 Vue3 Tokenizer 源码一
前端·javascript·vue.js
BigTopOne5 小时前
【WebRtc】-ICE Candidate 与 STUN/TURN 原理详解
前端
ltl5 小时前
Parquet 文件格式:row group、编码与谓词下推索引
数据库
l1258655 小时前
# LangGraph Memory机制深度解析:短期记忆与长期记忆的工程实践
前端·人工智能·python·langchain·bootstrap
ltl5 小时前
PostgreSQL Join 路径:优化器如何选中 Nested Loop
数据库
ltl6 小时前
RocksDB 生产嵌入:Flink、TiKV 与 Kafka Streams 怎么用
数据库
码视野6 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3