为什么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 设置。
相关推荐
乘风御浪云帆之上2 小时前
数据库操作【JDBC & HIbernate & Mybatis】
数据库·mybatis·jdbc·hibernate
cwj&xyp3 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
dlnu20152506223 小时前
ssr实现方案
前端·javascript·ssr
古木20193 小时前
前端面试宝典
前端·面试·职场和发展
dazhong20123 小时前
PLSQL 客户端连接 Oracle 数据库配置
数据库·oracle
轻口味4 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王5 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发5 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
了一li5 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt