OpenGL 函数加载是如何工作的?

How does OpenGL function loading work?

我知道有必要 "load" opengl 函数,让特殊函数根据 opengl 函数的名称定位指向函数的指针。我以前从未见过类似的东西,我想知道它是如何工作的。这些功能实际位于何处?它们是如何检索的?为什么要这样做?

Where are the functions actually located?

这取决于实现。我敢打赌,它们存储在函数名称的散列 table 中,指向函数指针。它们仍在共享库中,但通常不会公开它们的符号。

How are they retrieved?

glXGetProcAddress or wglGetProcAddress,取决于平台。大多数创建 OpenGL windows(GLFW、SDL)的库都有自己的使用上述功能的跨平台函数。

Why is it done this way?

我能想到几个原因:实现可以在不破坏 ABI 兼容性的情况下更改可用的扩展,以及您可以访问哪些功能可能取决于您请求的上下文类型或版本(例如,对于 Mesa,post OpenGL 3.1 扩展仅在 3.1+ 上下文中可用,在任何更低版本中均不可用。