OpenGL创建窗口

在这里插入图片描述

  1. 窗口初始化
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); \\主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); \\次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); \\核心渲染模式
  1. 创建窗口对象
// glfwCreateWindow函数需要窗口的宽和高作为它的前两个参数。第三个参数表示这个窗口的名称,后两个参数可以暂时忽略
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);
  1. 利用GLAD加载函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}
  1. 告诉OpenGL渲染窗口的大小,即视口ViewPort
// glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。
glViewport(0, 0, 800, 600);
  1. 释放资源
glfwTerminate();
return 0;
  1. 其他一些使创建窗口更合理的函数
  • 我们希望用户更改窗口大小适合视口也应该被调整,故对窗口注册一个回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
// 在main注册回调函数,使得每次调整窗口大小都调用这个函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  • 我们不希望绘制一个图像后就立即关闭窗口,而是只有当我们主动关闭它之前不断绘制并能接受用户输入,因而我们定义了一个渲染循环**(Render Loop),
  • ** 这里注意glfwSwapBuffers(window)函数,即交换颜色缓冲函数:它是一个储存着GLFW窗口每一个像素颜色值的大缓冲), 如果渲染是一部分一部分渲染的,那么图像就不是瞬间显示给用户,就显得很不真实,采用双缓冲机制,前缓冲保存着最终输出的图像,而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来
while(!glfwWindowShouldClose(window))
{
    glfwSwapBuffers(window); 
    glfwPollEvents() // 函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数;    
}
  • 我们同样希望在GLFW实现输入控制,利用Esc退出
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

因此,得到最终的渲染循环为:

// 渲染循环
while(!glfwWindowShouldClose(window))
{
    // 输入
    processInput(window);

    // 渲染指令, 我们自定义了一个有颜色屏幕
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // RGBAlpha(透明度)
   glClear(GL_COLOR_BUFFER_BIT);   //清空上一次渲染颜色缓冲,并使得整个颜色缓冲都会被填充为glClearColor里所设置的颜色

    // 检查并调用事件,交换缓冲
    glfwPollEvents();
    glfwSwapBuffers(window);
}

完成代码链接
https://github.com/purse1996/OpenGLExamples/blob/master/ConsoleApplication2/ConsoleApplication2/1.cpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章