我如何确定为什么OpenGL入口点丢失后更新我的图形驱动程序

How can I determine why OpenGL entry points are missing after updating my graphics driver

本文关键字:更新 我的 驱动程序 图形 何确定 为什么 OpenGL 入口      更新时间:2023-10-16

我最近更新了我的图形驱动程序,现在我发现许多程序在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();
}

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

(部分列表):

 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 7Microsoft VS 2012MSI笔记本电脑core-i7与英特尔HD 4000NVIDIA GeForce GTX680M显卡驱动版本:353.62

This:

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

不太正确。根据opengl.org:

虽然MSDN文档说wglGetProcAddress在失败时返回NULL,但有些实现将返回其他值。1, 2, 3,以及-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入口点,您需要有一个有效的上下文绑定——您有,不是吗?

顺便问一下,您确定要手动操作吗?GLEW可能是最好和最便携的方法。