利用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中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(