本文主要是介绍利用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_RESIZABLE | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_VISIBLE | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_DECORATED | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_FOCUSED | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_AUTO_ICONIFY | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_FLOATING | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_MAXIMIZED | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_RED_BITS | 8 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_GREEN_BITS | 8 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_BLUE_BITS | 8 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_ALPHA_BITS | 8 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_DEPTH_BITS | 24 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_STENCIL_BITS | 8 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_ACCUM_RED_BITS | 0 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_ACCUM_GREEN_BITS | 0 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_ACCUM_BLUE_BITS 0 | 0 to INT_MAX or GLFW_DONT_CARE | |
GLFW_ACCUM_ALPHA_BITS | 0 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_AUX_BUFFERS | 0 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_SAMPLES | 0 | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_REFRESH_RATE | GLFW_DONT_CARE | 0 to INT_MAX or GLFW_DONT_CARE |
GLFW_STEREO | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_SRGB_CAPABLE | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_DOUBLEBUFFER | GLFW_TRUE | GLFW_TRUE or GLFW_FALSE |
GLFW_CLIENT_API | GLFW_OPENGL_API | GLFW_OPENGL_API, GLFW_OPENGL_ES_API or GLFW_NO_API |
GLFW_CONTEXT_CREATION_API | GLFW_NATIVE_CONTEXT_API | GLFW_NATIVE_CONTEXT_API or GLFW_EGL_CONTEXT_API |
GLFW_CONTEXT_VERSION_MAJOR | 1 | Any valid major version number of the chosen client API |
GLFW_CONTEXT_VERSION_MINOR | 0 | Any valid minor version number of the chosen client API |
GLFW_CONTEXT_ROBUSTNESS | GLFW_NO_ROBUSTNESS | GLFW_NO_ROBUSTNESS, GLFW_NO_RESET_NOTIFICATION orGLFW_LOSE_CONTEXT_ON_RESET |
GLFW_CONTEXT_RELEASE_BEHAVIOR | GLFW_ANY_RELEASE_BEHAVIOR | GLFW_ANY_RELEASE_BEHAVIOR,GLFW_RELEASE_BEHAVIOR_FLUSH orGLFW_RELEASE_BEHAVIOR_NONE |
GLFW_OPENGL_FORWARD_COMPAT | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_OPENGL_DEBUG_CONTEXT | GLFW_FALSE | GLFW_TRUE or GLFW_FALSE |
GLFW_OPENGL_PROFILE | GLFW_OPENGL_ANY_PROFILE | GLFW_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创建一个窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!