OpenGL的运行环境配置

OpenGL运行环境搭配的方法

  • OpenGL只是一个图形库,因为是跨平台,每个系统上显示窗口是不一样的,所以OpenGL有目的地把这些操作抽象出去,所以我们不得不自己去创建窗口,定义OpenGL上下文以及处理用户的输入。
  • 所以就有一些库提供了这些功能,省去了我们码操作系统相关代码的时间,现在最流行的几个库有GLUT,SDL,SFML和GLFW,GLUT由于太古老了,而且有许多的坑,就算有了改进的freeGLUT,但是因为我用着不太顺,所以这里就不描述了,至于SDL,SFML我没用过,所以这里也不再描述,本篇使用的是GLFW。
  • GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我所需要的。
  • 下面就是建立GLFW的环境了,这里有两种方法:一种是使用CMake工程生成工具去编译你下载的GLFW库(下载地址),得到glfw3.lib库文件,把它放到你的工程之中,在项目属性中链接glfw3.lib,还有把你下载的GLFW库的include的文件也添加到你的项目之中。此方法比较麻烦。
  • 如果你用的是Visual Studio那么就很简单了,只需要用到Visual Studio的一个插件“NuGet”,这个插件在Visual Studio的工具–>扩展更新搜索下载即可,然后重启Visual Studio就可以装好。如图:就是这个插件
  • 装好之后打开Visual Studio创建一个c++空项目,右键点击项目选择“管理Nuget程序包”如图这里写图片描述
  • 下面就开始装GLFW了在浏览里搜索GLFW然后下载它安装GLFW
  • 安装好了之后项目将会多一个packages.config的配置文件,说明已经配置好了GLFW配置文件
  • 到这里别激动这就开始写代码,配置好GLFW之后我们还要配置一个东西
  • 因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。而这个异常复杂和繁琐,所幸的是有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
  • 下面就开始配置GLAD了,GLAD是一个开源的库,配置也与其他的库有些不同,GLAD使用了在线服务,在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。地址在线服务打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。这里写图片描述
  • GLAD现在应该提供给你了一个zip压缩文件,里面包含了两个文件夹(include和scr),include直接复制到你的项目目录下,src文件里的glad.c文件也复制到你的项目目录下并添加到你的工程之中。然后将工程指向include文件,在右键点击项目选择属性,在VC++目录的包含目录里添加include文件这里写图片描述
  • 这里写图片描述
  • 这里写图片描述
  • 现在就可以开兴的写代码了
  • 代码如下fist_Windows.cpp
  • -
#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <iostream>
/*
用户改变窗口的大小的时候,视口也应该被调整。
我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。
*/
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()
{
    /*
     *首先,我们在main函数中调用glfwInit函数来初始化GLFW,
     *然后我们可以使用glfwWindowHint函数来配置GLFW。
     *glfwWindowHint函数的第一个参数代表选项的名称,
     *我们可以从很多以GLFW_开头的枚举值中选择;
     *第二个参数接受一个整形,用来设置这个选项的值。
    */   
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    /*
     *glfwCreateWindow函数需要窗口的宽和高作为它的前两个参数。
     *第三个参数表示这个窗口的名称(标题),这里我们使用"LearnOpenGL",
    */
    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是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。
    */
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    /*
     *我们可以把它称之为渲染循环(Render Loop),它能在我们让GLFW退出前一直保持运行
    */
    while (!glfwWindowShouldClose(window))
    {
        processInput(window);

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

        glfwSwapBuffers(window);//函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
        glfwPollEvents();//函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
    }

    glfwTerminate();
    return 0;
}

/*
这里我们检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。
如果用户的确按下了返回键,
我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW。
下一次while循环的条件检测将会失败,程序将会关闭。
*/
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

/*
这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。
每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。
*/
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    //告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport)
    //glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。
    glViewport(0, 0, width, height);
}
  • 15
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值