很高兴导致 glfwSwapBuffers 出现 return 错误消息

glad causes glfwSwapBuffers to return error message

代码

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

int main()
{
    glfwInit();

    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
    }

    return 0;
}

背景资料
我的操作系统是windows10
的最新版本 我用的是visual studiov16.6.3(最新)
我是新手(今天刚学会 openGL),正在尝试学习如何使用 openGL 制作图形
我用 glad 和 GLFW

问题
该程序应该产生一个空白的无响应 window
除了在 运行 程序中,window 被创建但随后 glClear 命令 returns 错误“在 Project1.exe 中的 0x0000000000000000 抛出异常:0xC0000005:访问冲突执行位置 0x0000000000000000。 “

我试过的
(不出所料)注释掉问题代码导致程序 运行 正确
我已经重新安装了我的显卡驱动程序
我尝试在生成器站点上安装一堆不同的 glad 组合
我已经尝试 运行 以 32 位和 64 位(使用对应的 GLFW 位类型)
注释掉 #include 导致程序正常运行

图片
程序属性:
. C/C++:
. . 一般: https://i.stack.imgur.com/nirHo.png
. 链接器:
. . 一般: https://i.stack.imgur.com/zHkLT.png
. . 输入: https://i.stack.imgur.com/TbEiM.png
文件:
. GLFW: https://i.stack.imgur.com/DTxeX.png
. 高兴:https://i.stack.imgur.com/GXNaw.png

行为完全正确。因此,GLAD 所做的是为 <glad.h> 中的每个 GL 函数 Foo 设置一个 #define glFoo glad_glFooglad_glFoo 是指向适当类型的函数指针。所有这些函数指针都被初始化为 NULL.

因此,当您调用 glClear(GL_COLOR_BUFFER_BIT) 时,您实际上调用了 glad_glClear(GL_COLOR_BUFFER_BIT),当然最终调用地址为 0:

"Exception thrown at 0x0000000000000000 in Project1.exe: 0xC0000005: Access violation executing location 0x0000000000000000."

在调用 GLAD 函数指针之前,您必须完成所有这些事情:

  • 已成功调用 gladLoadGL,同时您为调用线程激活了 GL 上下文,
  • 将相同的 GL 上下文绑定到调用 GL 函数的线程(或兼容线程,但这是特定于平台的)
  • 确保 GL 函数实际上是由实现提供的,例如
    1. 通过检查保证该功能存在的特定 GL 版本 1.b) 通过在上下文创建时请求特定的所需 GL 版本并在不满足时退出
    2. 通过检查是否存在要求该功能可用的 GL 扩展
    3. 使用 GLAD,您甚至可以检查 NULL 指针,按照 GLAD 的工作方式,保证非 NULL 函数指针暗示函数的存在,因为 GLAD 在内部基本上在查询函数指针之前执行 1. 和 2.。请注意,底层 GL 扩展机制并非如此。您可能会查询一个不受支持的函数,而实现仍然可能会因此提供一个非 NULL 函数指针。调用是未定义的行为它的实现没有通过 GL 版本或扩展字符串公布此函数的存在。

由于 glClear 从一开始就存在于每个 GL 版本中,因此您的代码只缺少 gladLoadGL.