OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)

文章目录

    • OpenGL
    • GLFW & CMake
    • 链接到 Hello OpenGL!
    • GLAD
    • 运行测试

OpenGL

什么是 OpenGL,OpenGL 能做什么在此不再赘述

运行 OpenGL 需要准备的有:

  • CMake:用于执行编译
  • VS:我使用的是 Visual Studio 17 2022 版本
  • GLFW:C语言库,用 VS 2022 编译、链接
  • GLAD:OpenGL 的驱动层,同样需要和 VS 编译链接

GLFW & CMake

从 https://www.glfw.org/download.html 下载 GLFW 的源码
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第1张图片

CMake 需要绑定一个 c语言 编译器,这里选择你安装的 VS 版本即可
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第2张图片
然后解压 glfw 源码到一个文件夹
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第3张图片
在 CMake 中选择 glfw 的源码地址和构建输出目标地址

OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第4张图片
在下面点击 Configure 和 Generate,就可以编译出 sln 工程了
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第5张图片
随后使用 VS 2022 打开 GLFW.sln,生成解决方案,构建即可~

  1. 构建结束后在这个路径找到 glfw3.lib,这就是我们要的 GLFW 库文件了

OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第6张图片

  1. 回到 glfw 源代码文件夹,这里有个 include 文件夹,也是我们需要关注的文件

OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第7张图片
为了方便我们的 OpenGL 项目使用,我们找个地方创建一个文件夹,把东西放进去,include 直接复制到文件夹里,再创建一个 lib 文件夹把刚刚的 glfw3.lib 放进去~
在这里插入图片描述

链接到 Hello OpenGL!

右键点击我们的项目名称(在解决方案下面)打开属性
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第8张图片
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第9张图片
在这里添加:

  • 包含目录(对应 include)
  • 库目录(对应 lib)

OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第10张图片
在这里加上 glfw3.lib 和 opengl32.lib,别把分号忘记掉了
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第11张图片

GLAD

GLAD 的开源生成页面在:https://glad.dav1d.de/

选好这两项,在下面点击生成即可
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第12张图片
这就是结果源码,下载下来,把 include 导入即可
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第13张图片

需要注意的是,src 不是库,把里面的 glad.c 放在项目里面就可以了
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第14张图片

运行测试

然后创建一个 cpp 文件到源文件分类中,导入这两行,没问题就成功了~
在这里插入图片描述
实现了base.h & base.cpp,把 OpenGL 的一部分数据解耦出去了,main.cpp 负责调用运行
OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)_第15张图片

#include "base.h"

/// 
/// 初始化 glfw 并配置参数
/// 
void initGlfw() {
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}

/// 
/// 创建窗口对象, 存放了窗口相关数据
/// 
/// 
GLFWwindow* createWindowObj() {

    // todo
    GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_LABEL, NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return (GLFWwindow*)-1;
    }
    glfwMakeContextCurrent(window);
    return window;
}

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

void initViewport(GLFWwindow* window) {
    glViewport(0, 0, 800, 600);
    glfwSetFramebufferSizeCallback(window, [](GLFWwindow* window, int width, int height) {
        glViewport(0, 0, width, height);
        });
}

void mainThread(GLFWwindow* window) {
    while (!glfwWindowShouldClose(window))
    {
        // 检测输入
        [](GLFWwindow* window)
        {
            if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
                glfwSetWindowShouldClose(window, true);
        };

        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

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

你可能感兴趣的:(计算机图形学,图形渲染)