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

标签 c++ opengl

我最近更新了我的图形驱动程序,现在我发现很多程序在 opengl 库中找不到。我正在使用 gl3w,它生成以下代码以加载和绑定(bind)到 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 过程(失败 !!!):

(部分列表):

 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 带有 Intel HD 4000 的 MSI 笔记本电脑 core-i7 NVIDIA GeForce GTX680M显卡驱动版本:353.62

最佳答案

这个:

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 :

While the MSDN documentation says that wglGetProcAddress​ returns NULL on failure, some implementations will return other values. 1, 2, and 3 are used, as well as -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 入口点,您需要有一个有效的上下文绑定(bind) - 您有,不是吗?

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

关于c++ - 如何确定更新图形驱动程序后缺少 OpenGL 入口点的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768149/

相关文章:

java - LWJGL 游戏循环不工作

c++ - 带 GL 的多光源

c - 编译 Opengl 和 glut 的问题

c++ - Rcpp 在不打印空行时产生不同的输出

c++ - 你如何使用gdb?

c++ - OpenCV 中的随机顺序随机播放 cv::Mat

c++ - 将 cairo 表面直接渲染到 OpenGL 纹理

c++ - 如何调用作为参数给出的 C++ 类方法?

c++ - 如何比较结构

opengl - GLSL:顶点着色器中的sampler3D,纹理显示为空白