提问者:小点点

glad导致glfwSwapBuffers返回错误消息


代码

#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制作图形
我使用glad和GLFW

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

我所做的尝试
(毫不奇怪)注释掉问题代码导致程序正确运行
我已经重新安装了我的图形卡驱动程序
我已经尝试在生成器站点上安装了一组不同的glad组合
我已经尝试在32位和64位(使用COOResponse GLFW位类型)中运行程序
注释掉#include; 和; 使程序正常运行

图像
程序属性:
。 C/C++:
。 。general:https://i.stack.imgur.com/nirho.png
。 链接器:
。 。general: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


共1个答案

匿名用户

行为完全正确。 因此,glad所做的是为中的每个GL函数foo使用一个#define glFoo glad_glfoo,wighglad_glfoo作为指向适当类型的函数指针。 所有这些函数指针都初始化为null

因此,当您调用GLCLEAR(GL_COLOR_BUFFER_BIT);时,您实际上调用的是``GLAD_GLCLEAR(GL_COLOR_BUFFER_BIT)`,当然,它以调用地址0结束:

“在Project1.exe中的0x0000000000000000处引发异常:0xC0000005:执行位置0x0000000000000000的访问冲突。”

在调用glad函数指针之前,必须指向以下所有内容:

    当调用线程的GL上下文处于活动状态时,
  • 已成功调用GladInit
  • 将相同的GL上下文绑定到调用GL函数的线程(或兼容的线程,但这是特定于平台的)
  • 确保GL函数实际上是由实现提供的,例如
    1. 通过检查特定的GL版本来保证该函数的存在1.b)通过在上下文创建时请求特定的所需GL版本,如果不满足则退出
    2. 通过检查是否存在GL扩展来规定该函数的可用性
    3. 使用glad,您甚至可以检查null指针,因为glad的工作方式是,保证非null函数指针暗示函数的存在,因为glad在内部基本上是1。 和2。 在查询函数指针之前。 请注意,对于基础总帐扩展机制,这是不正确的。 您可能查询一个不受支持的函数,结果实现仍然可能提供一个非null函数指针。 如果实现没有通过GL版本或扩展字符串通告此函数的存在,则调用此函数是未定义的行为。

由于glclear从一开始就存在于每个GL版本中,所以您的所有代码都缺少gladinit