为什么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 设置。
相关推荐
hjxu20165 分钟前
【 MySQL 速记5】插入
android·数据库·mysql
浮笙若有梦7 分钟前
我开源了一个比 Ant Design Table 更好用的高性能虚拟表格
前端·vue.js
一只程序熊12 分钟前
vite-cool-unix-ctx] Unexpected token l in JSON at position 0
java·服务器·前端
张元清25 分钟前
React Hooks vs Vue Composables:2026 年全面对比
前端·javascript·面试
yuki_uix26 分钟前
从三个自定义 Hook 看 React 状态管理的设计思想
前端·javascript
大漠_w3cpluscom26 分钟前
如何在 clamp() 中使用 auto 值
前端·css·html
Younglina29 分钟前
🏸 从零打造一个羽毛球球线追踪网站:纯前端实战指南
前端
C澒31 分钟前
微前端容器标准化:从碎片化到统一架构的渐进式改造
前端·架构
一个处女座的程序猿O(∩_∩)O33 分钟前
性能调优实战:金仓数据库连接条件下推原理与案例拆解
数据库·oracle
CyrusCJA36 分钟前
JavaScript原型与super关键字
前端·javascript·js