You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:31:59