我最近更新了我的图形驱动程序,现在我发现很多程序在 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
returnsNULL
on failure, some implementations will return other values.1
,2
, and3
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/