首先是官网上的介绍: GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES GLFW是用于OpenGL,OpenGL ES,Vulkan开发的跨平台开源库。他提供了创建窗口、处理上下文(不是太清楚这个surface的含义)、接受输入和事件的简单API。 一个典型的GLFW程序框架应该是这样的: 完成初始化,指定OpenGL版本为3.3(这里和LearnOpenGL一致)。 接下来创建窗口对象,指定长宽为400*400,如果创建不成功的话得到的会是NULL。 接下来是 其函数原型为glViewport(GLint x,GLint y,GLsizei width,GLsizei height) 下面是主循环的部分: 所有用OpenGL的操作,只有在交换缓冲之后才会显示在窗口中。事件监听主要是对输入的监听,也就是鼠标键盘等输入事件,当glfwSetWindowShouldClose(window, true)被调用的时候,下一次循环就会退出了。 用于退出和清除。 GLFW设置了很多回调函数的接口,用于处理某些事件,主要有设置缓冲大小、键盘输入、鼠标点击、鼠标移动、鼠标滚动。 在主循环中每次执行glfwPullEvents的时候,就会对这些事件进行检测,是否触发,如果触发就会调用绑定的回调函数进行处理,每个回调函数都有格式要求,具体参见如下: 以下内容参考这里 这算是我第一篇技术博客,内容是比较微不足道的东西,算是自己做东西的一个记录,尽管参考和搬运的也不少,贴上去的代码都是实实在在的。
一、什么是GLFW
and Vulkan development on the desktop. It provides a simple API for
creating windows, contexts and surfaces, receiving input and events.
简单来说GLFW就是OpenGL的壳,因为渲染需要在窗口中显示,而在不同操作系统下,创建窗口、监听鼠标和键盘输入等功能的实现方法是不一样的,GLFW用统一的接口为开发者包办了这些事情,这样开发者只需要掌握GLFW的用法,而不需要去学习不同操作系统的相关接口。
GLFW在一定程度上取代了GLUT的作用,后者在20年前就已经不再被支持,但是也有后继者FreeGLUT。
配置GLFW不再赘述,参看LearnOpenGL中关于配置环境的部分:创建窗口
本文以OpenGL的立即渲染模式为例,核心模式也只需要设置一下,模式不同更多地影响的是OpenGL部分的内容,与GLFW关系不大。二、GLFW的窗口
const int WIDTH = 400, HEIGHT = 400; int main() { //// 设置窗口参数 // GLUT版本 //glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB); //glEnable(GL_DEPTH_TEST); //glutInitWindowSize(400,400); //glutInitWindowPosition(100,100); //glutCreateWindow("OpenGL Viewer"); // GLFW版本 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定OpenGL模式 //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } glViewport(0, 0, WIDTH, HEIGHT); // 初始化回调函数 //glutMouseFunc(mouse); //glutMotionFunc(motion); //glutDisplayFunc(display); //glutReshapeFunc(reshape); //glutKeyboardFunc(keyboard); //glutMainLoop(); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetKeyCallback(window, keyboard); glfwSetMouseButtonCallback(window, mouse); glfwSetCursorPosCallback(window, motion); glfwSetScrollCallback(window, reshape); glfwMakeContextCurrent(window); while (!glfwWindowShouldClose(window)) { display(window); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
glfwInit();// 初始化 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// 指定大版本 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 指定小版本
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; }
glViewport(0, 0, WIDTH, HEIGHT);
x,y 以像素为单位,指定了窗口的左下角位置。
width,height表示视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。
下面这一坨是绑定回调函数的,在下一部分会说:glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetKeyCallback(window, keyboard); glfwSetMouseButtonCallback(window, mouse); glfwSetCursorPosCallback(window, motion); glfwSetScrollCallback(window, scroll); glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window)) { display(window);// 自定义的函数,用于绘制 glfwSwapBuffers(window);// 交换缓冲 glfwPollEvents();// 检测所有等待中的事件监听 }
最后glfwTerminate();
三、GLFW的输入事件
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetKeyCallback(window, keyboard); glfwSetMouseButtonCallback(window, mouse); glfwSetCursorPosCallback(window, cursor); glfwSetScrollCallback(window, scroll);
void framebuffersize(GLFWwindow* window, int width, int height); void keyboard(GLFWwindow* window, int key, int scancode, int action, int mods); void mouse(GLFWwindow* window, int button, int action, int mods); void cursor(GLFWwindow* window, double x, double y); void scroll(GLFWwindow* window, double x, double y);
void framebuffersize(GLFWwindow* window, int* width, int* height)
void keyboard(GLFWwindow* window, int key, int scancode, int action, int mods)
void mouse(GLFWwindow* window, int button, int action, int mods);
void cursor(GLFWwindow* window, double x, double y)
void scroll(GLFWwindow* window, double x, double y)
四、总结
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算