很高兴导致 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_glFoo
,glad_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 函数实际上是由实现提供的,例如
- 通过检查保证该功能存在的特定 GL 版本
1.b) 通过在上下文创建时请求特定的所需 GL 版本并在不满足时退出
- 通过检查是否存在要求该功能可用的 GL 扩展
- 使用 GLAD,您甚至可以检查
NULL
指针,按照 GLAD 的工作方式,保证非 NULL
函数指针暗示函数的存在,因为 GLAD 在内部基本上在查询函数指针之前执行 1. 和 2.。请注意,底层 GL 扩展机制并非如此。您可能会查询一个不受支持的函数,而实现仍然可能会因此提供一个非 NULL
函数指针。调用是未定义的行为它的实现没有通过 GL 版本或扩展字符串公布此函数的存在。
由于 glClear
从一开始就存在于每个 GL 版本中,因此您的代码只缺少 gladLoadGL
.
代码
#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_glFoo
,glad_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 函数实际上是由实现提供的,例如
- 通过检查保证该功能存在的特定 GL 版本 1.b) 通过在上下文创建时请求特定的所需 GL 版本并在不满足时退出
- 通过检查是否存在要求该功能可用的 GL 扩展
- 使用 GLAD,您甚至可以检查
NULL
指针,按照 GLAD 的工作方式,保证非NULL
函数指针暗示函数的存在,因为 GLAD 在内部基本上在查询函数指针之前执行 1. 和 2.。请注意,底层 GL 扩展机制并非如此。您可能会查询一个不受支持的函数,而实现仍然可能会因此提供一个非NULL
函数指针。调用是未定义的行为它的实现没有通过 GL 版本或扩展字符串公布此函数的存在。
由于 glClear
从一开始就存在于每个 GL 版本中,因此您的代码只缺少 gladLoadGL
.