这不是访问 OpenGL 扩展的正确方法。正确的方法有点涉及,因为您不能重新定义可能从库中导入的符号。在 Windows 上不是什么大问题,因为只导出了 OpenGL-1.1 符号。但在几乎任何其他操作系统上,OpenGL 库都导出了额外的符号。
我强烈建议使用扩展加载器库,因为正确加载扩展很乏味。因此,只需从http://glew.sourceforge.net获取 GLEW并完成它。或者使用一些也提供扩展管理的 OpenGL 框架,如 GLFW。
只需看看如何正确加载 OpenGL 扩展,即可了解原因:
typedef GLAPI void APIENTRY (*__MYGLEXTFP_GLGENERATEMIPMAPS)(GLenum);
__MYGLEXTFP_GLGENERATEMIPMAP __myglextGenerateMipmaps;
#define glGenerateMipmaps __myglextGenerateMipmaps;
稍后在扩展初始化中:
#ifdef WIN32
#define __MYGLEXT_GetProcAddress wglGetProcAddress
#endif
#ifdef GLX
#define __MYGLEXT_GetProcAddress glXGetProcAddress
#endif
__myglGenerateMipmap =
(__MYGLEXTFP_GLGENERATEMIPMAPS) __MYGLEXT_GetProcAddress("glGenerateMipmaps");
看起来很乱,你同意吗?然而,这是唯一干净的方法。如果在 Windows 下使用多个 OpenGL 上下文,它确实会涉及更多,因为 Windows OpenGL 扩展函数的函数指针可能在上下文之间有所不同。