我正在努力学习OpenGL开发,在完成一些示例源代码的过程中,有一条线似乎无法理解。它涉及使用GLFW初始化GLAD。下面是整个代码块。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
因此,据我所知,if语句中的代码用于初始化GLAD,如果初始化成功则返回1,从而可以轻松处理错误。凉。虽然我感到困惑,但是这个gladLoadGLLoader
函数的输入是:
(GLADloadproc)glfwGetProcAddress
做了一些研究,GLADloadproc没有返回任何有用的内容,但是glfwGetProcAddress
在GLFW文档here中有一个条目,根据这个,它是一个函数并定义了1个必需参数。我认为这很奇怪,因为在源代码中它甚至看起来不像一个函数;看起来glfwGetProcAddress
是一个变量(或者对象可能?)被强制转换为GLADloadproc
类型。做了一些内省,我运行了以下打印:
std::cout << glfwGetProcAddress << std::endl;
std::cout << typeid(glfwGetProcAddress).name() << std::endl;
输出:
00AE1172
void (__cdec*__cdecl(char const *))(void)
所以我可以看到调用glfwGetProcAddress
实际上确实返回了一个看起来像地址的东西,但试图将其称为glfwGetProcAddress()
失败并且不需要一个参数。当看到这个假定的地址的类型时,我肯定不明白。所以我很好地使用它,因为它清楚地起作用并直接在官方文档和教程中引用,但我真的很想了解这里发生了什么,如果有人发生了比我更好的想法。
答案 0 :(得分:2)
typedef void* (* GLADloadproc)(const char *name);
这不仅仅是任何旧指针类型:它是函数指针类型。在您的代码中,您调用函数gladLoadGLLoader
,但传递 glfwGetProcAddress
的地址。 gladLoadGLLoader
现在可以随时调用你传递它的参数,并且无论它想要什么参数。你自己实际上并没有打电话给glfwGetProcAddress
。
在这种情况下,glfwGetProcAddress
是一个回调&#39;和gladLoadGLLoader
注册回调。
答案 1 :(得分:1)
OpenGL扩展(在某些操作系统上,每个未在OpenGL 1.1配置文件中定义的功能)都必须是loaded at runtime。这意味着必须通过适当的操作系统api(wgl / glx / ...)查询每个函数的地址。结果是可用于调用函数的function pointer。
GLAD现在是一个为您处理此函数指针加载的库。但是为了能够查询函数指针,它需要知道应该使用哪个方法来检索它们(如前所述,这是依赖于操作系统/窗口api)。 gladLoadGLLoader
的第一个参数是一个函数指针,指向用于按名称检索OpenGL函数指针的函数。 gladLoadGLLoader
然后调用此函数(指针)来查询其他函数指针。
对于glfw,使用的函数是glfwGetProcAddress
,但在使用过剩时,也可以使用glutGetProcAddress
或使用SDL时使用SDL_GL_GetProcAddress
。