如何不使用GLFW加载器(基于Windows头文件)初始化GLAD?
解决使用wglGetProcAddress初始化GLAD失败的问题
问题背景
尝试使用HGLRC OpenGL渲染上下文向HWND窗口渲染时,初始化GLAD遇到问题:gladLoadGLLoader((GLADloadproc)wglGetProcAddress)和gladLoadGL()均执行失败。当前使用GLAD OpenGL 4.0 core版本,此前依赖glfwGetProcAddress时工作正常。需要解决如何让gladLoadGLLoader正常运行,是否需要为wglGetProcAddress指定OpenGL版本,或更换加载器。
排查过程
更新1:定位失败点
在gladLoadGLLoader函数中,(PFNGLGETSTRINGPROC)load("glGetString")返回null,导致初始化直接失败。核心代码如下:
int gladLoadGLLoader(GLADloadproc load) { GLVersion.major = 0; GLVersion.minor = 0; glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); if(glGetString == NULL) // 此处返回失败 return 0; if(glGetString(GL_VERSION) == NULL) return 0; find_coreGL(); load_GL_VERSION_1_0(load); load_GL_VERSION_1_1(load); load_GL_VERSION_1_2(load); load_GL_VERSION_1_3(load); load_GL_VERSION_1_4(load); load_GL_VERSION_1_5(load); load_GL_VERSION_2_0(load); load_GL_VERSION_2_1(load); load_GL_VERSION_3_0(load); load_GL_VERSION_3_1(load); load_GL_VERSION_3_2(load); load_GL_VERSION_3_3(load); if (!find_extensionsGL()) return 0; return GLVersion.major != 0 || GLVersion.minor != 0; }
更新2:问题原因
wglGetProcAddress仅支持加载特定WGL扩展函数,无法直接加载核心OpenGL功能,这是初始化失败的核心原因。
更新3:补充说明
GLFW的glfwGetProcAddress同样基于wglGetProcAddress实现,但GLFW内部做了额外处理,所以之前使用GLFW时没有遇到该问题。
解决方案
通过自定义函数GetAnyGLFuncAddress替代wglGetProcAddress,先尝试用wglGetProcAddress获取函数地址,若失败则直接从opengl32.dll中加载,成功解决GLAD初始化问题:
void *GetAnyGLFuncAddress(const char *name) { void *p = (void *)wglGetProcAddress(name); if(p == 0 || (p == (void*)0x1) || (p == (void*)0x2) || (p == (void*)0x3) || (p == (void*)-1) ) { HMODULE module = LoadLibraryA("opengl32.dll"); p = (void *)GetProcAddress(module, name); } return p; } void Renderer::initGlad(){ // 初始化GLAD if (!gladLoadGLLoader((GLADloadproc)GetAnyGLFuncAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; } }
将原代码中的wglGetProcAddress替换为上述GetAnyGLFuncAddress函数,即可完成GLAD的正常初始化。
内容的提问来源于stack exchange,提问作者LucasSokol
相关产品推荐
相关产品推荐

