更新图形驱动程序后,如何确定缺少OpenGL入口点的原因

时间:2015-08-02 02:54:35

标签: c++ opengl

我最近更新了我的图形驱动程序,现在我发现在opengl库中找不到很多程序。我使用gl3w生成以下代码来加载和绑定到OpenGl入口点。请注意,在更新驱动程序之前,此代码工作正常。我添加了一些字符串来生成调试消息,但是代码是由gl3w创建的:

static void open_libgl(void)
{
    libgl = LoadLibraryA("opengl32.dll");
}

static void close_libgl(void)
{
    FreeLibrary(libgl);
}

static GL3WglProc get_proc(const char *proc)
{
    GL3WglProc res;
    std::string debugMessage = "WGL Load procedure : ";
    res = (GL3WglProc) wglGetProcAddress(proc);
    if (!res)
    {
        debugMessage = "    Load procedure : ";
        res = (GL3WglProc) GetProcAddress(libgl, proc);    // any attempt to get procedures from here fail (res == null)
    }
    debugMessage.append(proc);
    if(!res)
    {
        debugMessage.append("  FAILED !!!");
    }
    DEBUG_PRINT(debugMessage.c_str());
    return res;
}

int gl3wInit(void)
{
    open_libgl();
    load_procs();
    close_libgl();
    return parse_version();
}

上面的输出调试消息是找到或丢失的OpenGL程序的长列表(FAILED !!!):

(部分名单):

 WGL Load procedure : glVertexAttribP3uiv
 WGL Load procedure : glVertexAttribP4ui
 WGL Load procedure : glVertexAttribP4uiv
     Load procedure : glDrawArraysIndirect  FAILED !!!
     Load procedure : glDrawElementsIndirect  FAILED !!!
     Load procedure : glUniform1d  FAILED !!!
     Load procedure : glUniform2d  FAILED !!!
     Load procedure : glUniform3d  FAILED !!!
     Load procedure : glUniform4d  FAILED !!!
     Load procedure : glUniform1dv  FAILED !!!

gl3w生成的代码首先使用wglGetProcAddress检查入口点,如果没有找到,它将尝试GetProcAddress。检查输出我发现任何使用GetProcAddress查找过程的尝试都返回null(未找到)。

有关如何调试此建议的任何建议将不胜感激。提前谢谢!

系统详细信息: Windows 7的 微软VS 2012 MSI笔记本电脑核心-i7搭配Intel HD 4000 NVIDIA GeForce GTX680M显卡驱动版本:353.62

1 个答案:

答案 0 :(得分:0)

此:

res = (GL3WglProc) wglGetProcAddress(proc);
if (!res)
{
    debugMessage = "    Load procedure : ";
    res = (GL3WglProc) GetProcAddress(libgl, proc);    // any attempt to get procedures from here fail (res == null)
}

不太正确。根据{{​​3}}:

  

虽然MSDN文档说wglGetProcAddress失败时返回NULL,但某些实现会返回其他值。使用了123,以及-1

所以你可能会错过一些功能,只是不测试所有可能的结果。链接文章还提供了加载GL函数的示例函数:

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;
}

尝试这是否有效。另外,请记住,为了加载GL入口点,您需要有一个有效的上下文绑定 - 您有,不是吗?

顺便问一下,您确定要手动执行此操作吗? opengl.org可能是最好和最便携的方式。