OpenGL高级版本学习日志1:VS2019+GLFW+GLAD环境配置

1. 前言

我个人科研项目的图形学程序,一直都是基于较早版本的OpenGL标准进行开发的。最近在渲染一些模型效果的时候,始终存在各种问题,效果始终不能让我满意。这让我意识到升级OpenGL版本的必要性。这对于还在使用固定管线进行开发的我来说,进行高级版本的OpenGL学习,与学习一门新的技术几乎没有差别。我需要重新学习可编程渲染管线以及shader编程语言。这个过程是耗时耗力的,但同时也是有极大的吸引力的。因此,我希望把自己的学习过程记录下来,方便自己复习,并希望对未来有志于学习OpenGL程序开发的人提供一点帮助。

当然,利用图形学开源引擎完成任务,诸如OSG,ORGE这样的平台也是十分诱人的。但是考虑到整个项目开发的连贯性与学习成本,我认为将时间投入在高级版本的OpenGL学习上更加合适。不过如果未来有机会的话,我也会去学习成熟的开源引擎。

该专题下所有的内容基于Learnopengl:https://learnopengl.com/;中文网址为:https://learnopengl-cn.github.io/。如果你有兴趣深入学习OpenGL的一些特性,在网站上能够找到你所需要的大部分内容。

2. 资源

OpenGL实际上只是一个图形程序开发接口标准, 其实现是由显卡自身完成的。如果我们希望开发OpenGL程序,需要下载对应的使用工具库,如freeglut, glut, glfw等。按照Learnopengl的教程,我们基于glfw和glad来开发OpenGL程序:

GLFW:https://www.glfw.org/download.html

GLAD:https://glad.dav1d.de/

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的。

由于我的电脑是windows X64平台,下载对应的已编译版本即可:

由于OpenGL只是接口标准,具体实现是由显卡进行。这样使得在驱动层面,函数的寻址变得不统一。为解决该问题,GLAD被设计以透明化该问题。这里给出的GLAD下载地址是一个在线服务,需要用户根据自己的平台和OpenGL版本下载对应的包。通常基于VS平台进行开发,默认的选项如下:

点击右下角的生成按钮,生成对应的glad.zip,并且下载下来即可。

3. 配置

基于VS2019, 我们实现对OpenGL的配置

包含目录:

../glfw-3.3.bin.WIN64/include

../gladinclude

库目录:

../glfw-3.3.bin.WIN64/lib-vc2019

链接库:

glfw3dll.lib
glfw3.lib

注意,要把glad.c文件添加在你的项目中:

DLL链接有两种方法,一种是在环境变量里,将../glfw-3.3.bin.WIN64/lib-vc2019配置Path中,还有一种就是将glfw.dll拷贝到项目根目录文件。为了方便起见,我选择的是第二种。

4. 测试

我们贴出测试代码,如果能够顺利执行,说明配置正确:

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

#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    // glfw: initialize and configure
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    // glfw window creation
    // --------------------
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // glad: load all OpenGL function pointers
    // ---------------------------------------
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // render loop
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // glfw: terminate, clearing all previously allocated GLFW resources.
    // ------------------------------------------------------------------
    glfwTerminate();
    return 0;
}

// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow* window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // make sure the viewport matches the new window dimensions; note that width and 
    // height will be significantly larger than specified on retina displays.
    glViewport(0, 0, width, height);
}

运行结果是输出一个窗口:

如果你实现了上述步骤,并看到了窗口,那么恭喜你,你已经实现了OpenGL的HelloWorld程序。

猜你喜欢

转载自blog.csdn.net/aliexken/article/details/110656551