我正在学习 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()
会失败,而不是令人震惊的是需要一个论据。当查看这个假定地址的类型时,我绝对不明白。因此,我很乐意使用它,因为它显然有效,并且在官方文档和教程中直接引用,但我真的很想了解这里发生的情况,如果有人碰巧确实比我有更好的想法。
最佳答案
OpenGL 扩展(在某些操作系统上,OpenGL 1.1 配置文件中未定义的每个函数)必须是 loaded at runtime 。这意味着必须通过适当的操作系统 API (wgl/glx/...) 查询每个函数的地址。结果是 function pointer可用于调用该函数。
GLAD 现在是一个为您处理函数指针加载的库。但是为了能够查询函数指针,它需要知道应该使用哪种方法来检索它们(正如已经说过的,这是操作系统/窗口 api 相关的)。 GladLoadGLLoader 的第一个参数是一个函数指针,指向用于按名称检索 OpenGL 函数指针的函数。 gladLoadGLLoader
然后调用这个函数(指针)来查询其他函数指针。
对于 glfw,使用的函数是 glfwGetProcAddress
,但也可以在使用 glut 时传递 glutGetProcAddress
或在使用 SDL 时传递 SDL_GL_GetProcAddress
.
关于c++ - 在源代码中,调用函数时不使用 ()。文档给出了 1 个必需参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48329950/