此篇博文为个人OpenGL学习笔记,内容参考LearnOpenGL CNGLFW官方文档OpenGL 4 Reference Pages、OpenGL编程指南(原书第9版)

开发环境配置好之后创建一个窗口。

在Visual Studio解决方案中新建.cpp文件并在文件最前面添加如下两行头文件:

#include <glad/glad.h>
#include <GLFW/glfw3.h>

GLAD的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL的头文件之前包含GLAD。

在程序运行出错时我们还需要使用IO(std::cout)输出一些错误信息,所以加上如下一行头文件:

#include <iostream>

创建main 函数,初始化GLFW并在程序退出之前销毁GLFW:

int main() {
    if (!glfwInit()) {
        std::cout << "Failed to initialize GLFW" << std::endl;
        return -1;
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwTerminate();
    return 0;
}

创建窗口对象,这个窗口对象存放了所有和窗口相关的数据,而且会被GLFW的其它函数频繁地用到:

GLFWwindow* window = glfwCreateWindow(800, 600, "Hello OpenGL", NULL, NULL);
if (window == NULL) {
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD:

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

在开始渲染之前还需要通过函数glViewport()设置OpenGL渲染窗口的尺寸大小:

glViewport(0, 0, 800, 600);

实际上也可以将视口的尺寸设置的比GLFW窗口小,这样之后所有的OpenGL渲染将会在一个更小的窗口中显示,也可以将一些其它元素显示在OpenGL视口之外。

当用户改变窗口大小的时候,视口也应该被调整。可以对窗口注册一个回调函数,它会在每次窗口大小被调整的时候被调用:

void FramebufferSizeCallback(GLFWwindow* window, int width, int height) {
    glViewport(0, 0, width, height);
}

每当窗口调整大小的时候调用这个函数:

glfwSetFramebufferSizeCallback(window, FramebufferSizeCallback);

当窗口被第一次显示的时候FramebufferSizeCallback()也会被调用。

添加渲染循环使程序在被关闭之前不断地绘制图像:

while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);
    glfwPollEvents();
}

创建一个函数在GLFW中实现一些输入控制:

void ProcessInput(GLFWwindow* window) {
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, true);
    }
}

此函数会在用户按下Esc时会把窗口关闭属性设置为true,这样就可以跳出渲染循环。

在渲染循环中每一个循环中调用此函数:

ProcessInput(window);

这样就可以在每一帧检测特定的按键是否按下并作出处理。

在渲染循环中执行所有的渲染操作:

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

完整代码:

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

void FramebufferSizeCallback(GLFWwindow* window, int width, int height) {
    glViewport(0, 0, width, height);
}

void ProcessInput(GLFWwindow* window) {
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, true);
    }
}

const unsigned int window_width = 800;
const unsigned int window_height = 600;

int main() {
    if (!glfwInit()) {
        std::cout << "Failed to initialize GLFW" << std::endl;
        return -1;
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow* window = glfwCreateWindow(window_width, window_height, "Hello OpenGL", NULL, NULL);
    if (window == NULL) {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, FramebufferSizeCallback);
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    while (!glfwWindowShouldClose(window)) {
        ProcessInput(window);
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
    return 0;
}

运行效果:

运行效果

Last modification:February 24th, 2020 at 08:59 pm
如果觉得我的文章对你有用,请随意赞赏