为什么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 设置。
相关推荐
胡斌附体14 分钟前
小程序难调的组件
前端·小程序·apache·datepicker·自定义组件·checkbox
奋进小子16 分钟前
达梦数据库DISQL连接数据库方法
数据库
山茶花开时。20 分钟前
[Oracle] LEAST()函数
数据库·oracle
Mintopia30 分钟前
AIGC Claude(Anthropic)接入与应用实战:从字节流到智能交互的奇妙旅程
前端·javascript·aigc
Mintopia31 分钟前
Next.js 样式魔法指南:CSS Modules 与 Tailwind CSS 实战
前端·javascript·next.js
用户214118326360244 分钟前
dify案例分享-解锁 AI 搜索新玩法:Dify 秘塔搜索工作流搭建教程与效果展示
前端
0wioiw044 分钟前
Redis(①-安装和基本使用教程)
数据库·redis·缓存
六毛的毛1 小时前
Langchain入门:构建一个基于SQL数据的问答系统
数据库·sql·langchain
Stefan的技术笔记1 小时前
LangChain入门指南:5大核心组件解析,快速上手AI应用开发!
前端·langchain
悟空和大王1 小时前
video标签自定义控制按钮--全屏与非全屏--播放与暂停
前端