我最近更新了我的图形驱动程序,现在我发现在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
答案 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
,但某些实现会返回其他值。使用了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入口点,您需要有一个有效的上下文绑定 - 您有,不是吗?
顺便问一下,您确定要手动执行此操作吗? opengl.org可能是最好和最便携的方式。