利用GLFW创建一个窗口

2023-10-24 11:08
文章标签 创建 窗口 glfw

本文主要是介绍利用GLFW创建一个窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用GLFW创建一个窗口

  • 创建窗口前的准备工作
    • GLFW初始化
      • 设置界面属性
        • 界面相关属性
        • 缓冲区相关属性
        • 上下文相关属性
        • 各个属性的默认值和取值范围
  • 创建窗口
  • 显示窗口
  • 完整代码
  • 窗口事件交互
  • 完整代码

创建窗口前的准备工作

创建GLFW窗口前需要先初始化GLFW并且设置窗口选项

GLFW初始化

int glfwInit(void);

成功返回 GLFW_TRUE 否则返回 GLFW_FALSE,
glfw没有布尔型数据采用1为true 0为false

设置界面属性

界面相关属性
	GLFW_RESIZABLE----------------用户能否调节窗口大小GLFW_VISIBLE------------------窗口是否可见GLFW_DECORATED----------------窗口边框的小部件是否可见GLFW_FOCUSED------------------窗口是否具有输入焦点GLFW_AUTO_ICONIFY-------------全屏窗口是否在焦点丢失,关闭窗口小部件等图标化GLFW_FLOATING-----------------置顶GLFW_MAXIMIZED----------------窗口最大化GLFW_CENTER_CURSOR------------光标是否在新创建的全屏窗口上居中GLFW_TRANSPARENT_FRAMEBUFFER--窗口透明GLFW_FOCUS_ON_SHOW------------获得输入焦点时glfwShowWindow是否被调用GLFW_SCALE_TO_MONITOR---------根据监视器内容比例调整窗口内容区域的大小GLFW_REFRESH_RATE-------------全屏时指定刷新率
缓冲区相关属性
	GLFW_RED_BITS-----------------颜色缓冲区中红色深度GLFW_GREEN_BITS---------------颜色缓冲区绿色深度GLFW_BLUE_BITS----------------颜色缓冲区蓝色深度GLFW_ALPHA_BITS---------------颜色缓冲区混合深度GLFW_DEPTH_BITS---------------深度缓冲区深度GLFW_STENCIL_BITS-------------模板缓冲区深度GLFW_ACCUM_RED_BITS-----------累积缓冲区中红色深度GLFW_ACCUM_GREEN_BITS---------累积缓冲区中绿色深度GLFW_STEREO	------------------OpenGL立体渲染GLFW_DOUBLEBUFFER-------------双缓冲区GLFW_ACCUM_BLUE_BITS----------累计缓冲区中蓝色深度GLFW_ACCUM_ALPHA_BITS---------累计缓冲区中混合深度GLFW_AUX_BUFFERS--------------辅助缓冲区GLFW_SAMPLES------------------多重采样的样本数GLFW_SRGB_CAPABLE-------------缓冲区是否支持sRGB
上下文相关属性
	GLFW_CONTEXT_VERSION_MAJOR---设置主版本号GLFW_CONTEXT_VERSION_MINOR---设置次版本号GLFW_CLIENT_API--------------设置OpenGL版本GLFW_CONTEXT_CREATION_API----创建上下文的APIGLFW_OPENGL_FORWARD_COMPAT---是否向之前版本兼容GLFW_OPENGL_DEBUG_CONTEXT----是否创建调试上下文GLFW_OPENGL_PROFILE----------指定OpenGL上下文的配置文件GLFW_CONTEXT_ROBUSTNESS------指定上下文的健壮性策略GLFW_CONTEXT_RELEASE_BEHAVIOR-指定上下文要使用的发布行为GLFW_CONTEXT_NO_ERROR--------是否应由上下文生成错误
各个属性的默认值和取值范围
属性默认值取值范围
GLFW_RESIZABLEGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_VISIBLEGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_DECORATEDGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_FOCUSEDGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_AUTO_ICONIFYGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_FLOATINGGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_MAXIMIZEDGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_RED_BITS80 to INT_MAX or GLFW_DONT_CARE
GLFW_GREEN_BITS80 to INT_MAX or GLFW_DONT_CARE
GLFW_BLUE_BITS80 to INT_MAX or GLFW_DONT_CARE
GLFW_ALPHA_BITS80 to INT_MAX or GLFW_DONT_CARE
GLFW_DEPTH_BITS240 to INT_MAX or GLFW_DONT_CARE
GLFW_STENCIL_BITS80 to INT_MAX or GLFW_DONT_CARE
GLFW_ACCUM_RED_BITS00 to INT_MAX or GLFW_DONT_CARE
GLFW_ACCUM_GREEN_BITS00 to INT_MAX or GLFW_DONT_CARE
GLFW_ACCUM_BLUE_BITS 00 to INT_MAX or GLFW_DONT_CARE
GLFW_ACCUM_ALPHA_BITS00 to INT_MAX or GLFW_DONT_CARE
GLFW_AUX_BUFFERS00 to INT_MAX or GLFW_DONT_CARE
GLFW_SAMPLES00 to INT_MAX or GLFW_DONT_CARE
GLFW_REFRESH_RATEGLFW_DONT_CARE0 to INT_MAX or GLFW_DONT_CARE
GLFW_STEREOGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_SRGB_CAPABLEGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_DOUBLEBUFFERGLFW_TRUEGLFW_TRUE or GLFW_FALSE
GLFW_CLIENT_APIGLFW_OPENGL_APIGLFW_OPENGL_API, GLFW_OPENGL_ES_API or GLFW_NO_API
GLFW_CONTEXT_CREATION_APIGLFW_NATIVE_CONTEXT_APIGLFW_NATIVE_CONTEXT_API or GLFW_EGL_CONTEXT_API
GLFW_CONTEXT_VERSION_MAJOR1Any valid major version number of the chosen client API
GLFW_CONTEXT_VERSION_MINOR0Any valid minor version number of the chosen client API
GLFW_CONTEXT_ROBUSTNESSGLFW_NO_ROBUSTNESSGLFW_NO_ROBUSTNESS, GLFW_NO_RESET_NOTIFICATION orGLFW_LOSE_CONTEXT_ON_RESET
GLFW_CONTEXT_RELEASE_BEHAVIORGLFW_ANY_RELEASE_BEHAVIORGLFW_ANY_RELEASE_BEHAVIOR,GLFW_RELEASE_BEHAVIOR_FLUSH orGLFW_RELEASE_BEHAVIOR_NONE
GLFW_OPENGL_FORWARD_COMPATGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_OPENGL_DEBUG_CONTEXTGLFW_FALSEGLFW_TRUE or GLFW_FALSE
GLFW_OPENGL_PROFILEGLFW_OPENGL_ANY_PROFILEGLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_COMPAT_PROFILEor GLFW_OPENGL_CORE_PROFILE

创建窗口

GLFW下使用glfwCreateWindow函数创建窗口

GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
功能:此功能创建一个窗口及其关联的打开GL或打开GL ES上下文.
参数:width:	宽度height: 高度title:  标题monitor: 全屏模式或者窗口模式的监视器(给NULL )share:  共享资源或者不共享资源的窗口(给NULL)
返回值:成功返回窗口的句柄否则返回NULL可能的错误包括:GLFW_NOT_INITIALIZED -------------------没有初始化GLFW_INVALID_ENUM-----------------------无效的枚举GLFW_INVALID_VALUE----------------------无效的数值GLFW_API_UNAVAILABLE--------------------api不可用GLFW_VERSION_UNAVAILABLE-----------------版本不可用GLFW_FORMAT_UNAVAILABLE------------------格式错误GLFW_PLATFORM_ERROR----------------------平台错误

显示窗口

显示用glfwCreateWindow创建出来的窗口

void glfwMakeContextCurrent(GLFWwindow* window);参数:glfwCreateWindow创建的句柄

到此GLFW创建的窗口已经可以显示了,在程序结束之前还需要调用glfwTerminate函数释放掉GLFW的资源

完整代码

int main() {//glfw初始化glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);GLFWwindow* window = glfwCreateWindow(800, 600, "test", NULL, NULL);if(window == NULL) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwTerminate();return 0;
}

代码编译运行后会发现,窗口闪了一下就退出了,需要创建一个循环用于实现窗口的交互并且让窗口不释放

窗口事件交互

在调用窗口释放之前创建一个while循环循环条件是glfwWindowShouldClose函数的返回值

glfwWindowShouldClose(GLFWwindow*)
功  能:检查窗口是是否关闭
返回值:没有关闭返回GLFW_TRUE否则返回GLFW_FALSE

while循环中的内容

while(glfwWindowShouldClose(window )){//输入事件//窗口背景//绘制图案
}

完整代码

int main() {//glfw初始化glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);GLFWwindow* window = glfwCreateWindow(800, 600, "test", NULL, NULL);if(window == NULL) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);while(glfwWindowShouldClose(window )){//输入事件//窗口背景//绘制图案}glfwTerminate();return 0;
}

这篇关于利用GLFW创建一个窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274720

相关文章

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时