0

代码

#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;
}

背景信息
我的操作系统是最新版本的windows 10
我使用visual studio v16.6.3(最新)
我很新(今天刚学习openGL)并且正在尝试学习如何使用openGL制作图形
我使用gold和GLFW

问题
该程序应该生成一个空白的无响应窗口
除非在运行程序时,该窗口被创建,但随后 glClear 命令返回错误“Project1.exe 中在 0x0000000000000000 处引发的异常:0xC0000005:访问冲突执行位置 0x0000000000000000。”

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

图像
程序属性:
. 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

4

1 回答 1

2

这种行为是完全正确的。所以 GLAD 所做的是为 中的#define glFoo glad_glFoo每个 GL 函数Foo提供一个<glad.h>,并glad_glFoo作为指向适当类型的函数指针。A;所有这些函数指针都被初始化为NULL.

所以当你打电话时,glClear(GL_COLOR_BUFFER_BIT)你实际上是在打电话glad_glClear(GL_COLOR_BUFFER_BIT),当然最后是调用地址 0:

“在 Project1.exe 中的 0x0000000000000000 处引发异常:0xC0000005:访问冲突执行位置 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.

于 2020-07-06T13:25:08.717 回答