OpenGL开发环境搭建教程

最近在学习OpenGL,搭建环境的时候发现网络上面的教程都太笼统了,而且跟着上面搭建最后各种报错,这里我会一步一步详细的教大家如何搭建OpenGL的开发环境。注意如果我教程里提供的链接打不开,请尝试科学上网

准备

需要的软件

  • VS 2017(随便什么版本都行,我这里用的是2017)
  • CMake

开发系统

  • Windows

配置GLFW

在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地从这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在教程里我们将使用GLFW。

第一步

我们去GLFW的官网上下载源码包

OpenGL开发环境搭建教程_第1张图片
这里下载

我们把下载好的源码包解压

第二步

这里我们需要用到CMake这个软件把源码编译,这个软件直接去百度下载就OK了,下载安装好了打开软件,在where is the source code选择我们解压好的源码存放的文件夹,where is the build the binaries里面随便选择一个文件夹存放编译好的文件。然后点击configure然后选择你对应你所使用的VS版本,然后再点击Generate,等待编译完成就行了,那些飘红的东西完全可以无视了。

OpenGL开发环境搭建教程_第2张图片

第三步

完成后我们可以在文件夹里看见编译生成的文件,这时候我们要用我们的VS来打开里面的GLFW.sln,来打开这个项目,然后直接点击Build Solution(生成解决方案)按钮,然后编译的库glfw3.lib(注意我们用的是第3版)就会出现在src/Debug文件夹内。然后我们创建一个文件夹命名为OpenGL,再在里面创建一个名字叫lib的文件夹,把我们刚才生成的glfw32.lib文件放进去,再去我们一开始解压GLFW的文件夹,把里面的include文件夹也复制到OpenGL文件里。

创建工程

现在我们就可以在我们的VS里面新建项目了,我们新建一个空白的vc++的项目,新建完毕后,我们右击我们的项目选择属性:


OpenGL开发环境搭建教程_第3张图片

然后在VC++目录这个选项里,在包含目录里添加我们创建好的OpenGL/include文件夹的位置,在库目录里添加OpenGL/ilb文件夹的位置


OpenGL开发环境搭建教程_第4张图片
image.png


OpenGL开发环境搭建教程_第5张图片

然后我们再在链接器选项里选择输入后编辑附加依赖项


OpenGL开发环境搭建教程_第6张图片

在里面输入
opengl32.lib
glfw3.lib
OpenGL开发环境搭建教程_第7张图片

然后点确认,一定要记得所有选项都要点确定,不然都白忙活了。

GLAD

到这里还没有结束,我们仍然还有一件事要做。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。你可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
首先我们要去官网下载,这里我们随便选一个GL的版本然后点击GENERATE,然后下载生成的压缩包,然后解压。

OpenGL开发环境搭建教程_第8张图片

解压后把里面的include的文件夹同样复制到我们前面建立的OpenGL文件夹里,把src文件夹里的glad.c文件放到我们项目的源文件里
OpenGL开发环境搭建教程_第9张图片

开始OpenGL

到这里我们的环境就搭建好了,我们可以建个窗体来测试一下,首先我们先新建一个cpp文件
在里面写入代码

#include 
#include 

#include 

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); // uncomment this statement to fix compilation on OS X
#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);
}

然后点击本地Windows调试器,就可以看到我们创建的窗体了,也就代表着我们OpenGL环境搭建大成功!!!

你可能感兴趣的:(OpenGL开发环境搭建教程)