<二> 初探openl,创建一个窗口
配置好环境后,我们开始创建一个窗口。
#include <glad/glad.h> #include <GLFW/glfw3.h> glfwInit(); -- 初始化glfw --此函数用于配置glfw,第一个参数接受需要配置的key,后面为值
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); --设定使用的主版本 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); --设定使用的次版本 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); --使用核心版本 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); --创建窗口,接受长,宽,窗口名字,后面填NULL,暂时忽略 if (!window) { glfwTerminate(); --失败则执行退出 return -1; } glfwMakeContextCurrent(window); -- 使用window作为当前主上下文 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) //使用opengl函数前先初始化glad,这样opengl的方法才能正常使用 { return -1; } glViewport(0, 0, 800, 600); //设置视口大小,左下角坐标0,0,大小800,600 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //注册回调,当窗口改变时候,会执行我们的回调 initShader(window); //这里执行一些初始化操作,就是下节讲的着色器 // 主循环,让窗口不要瞬间消失 while (!glfwWindowShouldClose(window)) { processInput(window); //处理自己的输入操作 draw(); //绘图 glfwSwapBuffers(window); //交换缓冲区,双缓冲机制 glfwPollEvents(); //处理事件 } glfwTerminate(); //注销操作,释放资源 return 0;
}
运行代码,应该会出现一个黑色窗口才对,因为我们啥也没干,所以就这样。
当然我们可以尝试修改一下bg的颜色,我们在主循环里加入下面代码
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);
用其他颜色来填充背景,第一个方法是设定清理所用的颜色,然后第二个就做清理操作,他就会用这个颜色来填充我们写的GL_COLOR_BUFFER_BIT缓冲区。opengl还有其他缓冲区,例如深度缓冲,模板缓冲等。
对于为什么使用一个循环大家应该都了解,不循环窗口一闪而过,一般游戏引擎里都会存在一个主循环,我们在每一帧里渲染我们需要显示的东西,然后擦掉,期间会出现一个每一帧需要的时间,这个时间可以用于决定我们下一帧的一些操作。