使用GLAD加载OpenGL的库

疑问

在上一篇博客《试用GLFW并创建OpenGL和DX的环境》里创建OpenGL环境时,我将opengl32.lib加入了工程的“附加依赖项”,之后成功让程序编译成功。如果不加入,则会找不到OpenGL函数的实现:

1>main_GL.obj : error LNK2019: 无法解析的外部符号 __imp_glClear,函数 main 中引用了该符号

我注意到,opengl32.lib是在我的Windows操作系统环境中的(我在本地Windows10SDK的各个版本中都能看到它)
在这里插入图片描述
但我还是存有很大的疑问。首先这个加入opengl32.lib的做法,并不是来源官方的资料,是我看其他网友的方法;此外,这个32的后缀提示了它是对应32位的,而我的程序是64位的,却并没有找到对应64位的库。
GLFW官方教程中是使用GLAD来加载OpenGL的库。因此我想这是否才是最“正确”的做法?

为什么要使用GLAD加载库

这篇论坛中,也有人问了问题:“为什么要在OpenGL初始化阶段使用GLAD?”

回答:
在这里插入图片描述
翻译:

首先,你并没有指定OpenGL相关联的.obj文件,所以链接器找不到那些函数的实现。在Windows平台上,你可能会使用opengl32.lib,它是opengl32.dll的导入库,从Windows95开始就存在于每个Windows版本中。
然而,这个opengl32.dll实际上并没有包含你正在使用的那个OpenGL版本的实现,它包含的是微软的OpenGL 1.1 GDI 软件光栅化。你在Windows上真正使用的OpenGL实现是由显卡的驱动程序提供的。对于OpenGL1.0和1.1函数,opengl32.dll会扮演一个trampoline的角色,将调用转发到驱动的dll上。
如果你想调用OpenGL高于1.1版本(1997年)的函数,你就不得不在每次都使用OpenGL扩展机制,因为opengl32.dll并不提供他们的入口,编译器/链接器也自然找不到那些函数。


感觉这个回答很清晰,我觉得可信度极高。
那么答案很明白了:为了更方便使用OpenGL完整的功能,需要使用GLAD加载OpenGL的库,而不是使用opengl32.lib

OpenGL Loading Library 的概念

GLAD本质上是一个OpenGL Loading Library

An OpenGL Loading Library is a library that loads pointers to OpenGL functions at runtime, core as well as extensions. This is required to access functions from OpenGL versions above 1.1 on most platforms. Extension loading libraries also abstracts away the difference between the loading mechanisms on different platforms.

Most extension loading libraries override the need to include gl.h at all. Instead, they provide their own header that must be used. Most extension loading libraries use code generation to construct the code that loads the function pointers and the included headers. Information is available if you wish to perform this manually, but you are encouraged to use one of these libraries yourself.

一个OpenGL Loading Library是一个库,可以用来在运行时读取OpenGL的函数地址,即包括【核心】也包括【扩展】。对于想要访问高于1.1的功能,使用OpenGL Loading Library都是必须的。而对于【扩展】的读取,它也抽象了在不同平台读取机制间的差异。
大多数 extension loading libraries 都不需要再包含gl.h了。作为替代,它们自己提供头文件。大多数 extension loading libraries 都使用“代码生成”来构建那些用来读取函数地址的代码。如果你希望手动操作,则需要提供一些信息,但建议你使用这些库之一。


随后,OpenGL Loading Library wiki页面上也提供了一些库,其中包括GLAD

实践使用GLAD加载OpenGL的库

0. 使用GLAD生成读取函数地址的代码

GLAD的Git:https://github.com/Dav1dde/glad
如果不想安装GLAD,也可以直接使用在线服务

  • 选择语言为C/C++
  • 规范选择OpenGL
  • API版本选择4.6,这是当前我能选的最新版本
  • “Profile”可以选择“核心”或者“扩展”,这里我选择“核心”。
  • 最后,点击【Generate】按钮。

在这里插入图片描述
随后,读取函数地址的代码自动生成。
选择下载glad.zip
在这里插入图片描述

1. 配置工程

(注意,之前的opengl32.lib已经去掉了)
在这里插入图片描述
将在上一步中下载的\glad\src\glad.c拷贝到工程中,因为需要编译它:
在这里插入图片描述
当然,工程中也需要加入它:
在这里插入图片描述

随后,将在上一步下载的\glad\include添加到包含目录
在这里插入图片描述

2. 代码

随后,就是使用GLAD了,也很简单。
首先是include头文件,在GLFW官方教程中指出需要添加GLFW_INCLUDE_NONE宏来防止冲突,因此include部分变成了:

#define GLFW_INCLUDE_NONE
#include <glfw3.h>
#include <glad/glad.h>

然后,在初始化OpenGL上下文之后,使用GLAD来加载OpenGL的函数地址

/* Make the window's context current */
glfwMakeContextCurrent(window);

//使用GLAD来加载OpenGL的函数地址
gladLoadGL();

随后,程序照常运行


完整代码:

#define GLFW_INCLUDE_NONE
#include <glfw3.h>
#include <glad/glad.h>

int main(void)
{
    //必须先初始化该库,然后才能使用大多数GLFW函数。成功初始化后,GLFW_TRUE将返回。如果发生错误,GLFW_FALSE则返回。
    if (!glfwInit())
        return -1;

    //创建窗口(OpenGL上下文似乎也一并创建了)
    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    //使用GLAD来加载OpenGL的函数地址
    gladLoadGL();

    //循环直到用户关闭窗口
    while (!glfwWindowShouldClose(window))
    {
        //清理屏幕所用的颜色:
        glClearColor(0.4f, 0.5f, 0.6f, 1.0f);
        //清理屏幕
        glClear(GL_COLOR_BUFFER_BIT);

        //交换前后缓冲
        glfwSwapBuffers(window);

        //轮询并处理事件
        glfwPollEvents();
    }

    //使用GLFW完成操作后,通常是在应用程序退出之前,需要终止GLFW
    glfwTerminate();

    return 0;
}
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值