为什么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 设置。
相关推荐
浏览器爱好者几秒前
如何在AWS上部署一个Web应用?
前端·云计算·aws
Elastic 中国社区官方博客4 分钟前
设计新的 Kibana 仪表板布局以支持可折叠部分等
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
xiao-xiang17 分钟前
jenkins-通过api获取所有job及最新build信息
前端·servlet·jenkins
深蓝海拓26 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
C语言魔术师33 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
刘好念38 分钟前
[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)
c++·计算机图形学·opengl·glsl
匹马夕阳2 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?2 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
C嘎嘎嵌入式开发2 小时前
什么是僵尸进程
服务器·数据库·c++
Yeats_Liao4 小时前
Navicat 导出表结构后运行查询失败ERROR 1064 (42000): You have an error in your SQL syntax;
数据库·sql