我如何确定为什么OpenGL入口点丢失后更新我的图形驱动程序
How can I determine why OpenGL entry points are missing after updating my graphics driver
我最近更新了我的图形驱动程序,现在我发现许多程序在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可能是最好和最便携的方法。
相关文章:
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 为什么我的数组值会更新为随机值?
- 为什么我的矢量不随我对其元素所做的更改而更新
- 如何确保我的"ifstream"文件对象指向的文件内容已更新?
- C++无法更新我的一个变量
- 在CentOS 7上安装GCC 7.4.0不会更新我的LIBSTDC 版本
- 为什么我的函数只在我用 & 符号传递结构时才更新结构?
- 为什么我的终端没有运行更新的C++代码?
- 2D 弹丸 - 更新我的 x 和 y 值
- 如何在使用 WxWidgets 从串行端口读取时不断更新我的面板绘图
- 如何为我的Visual Studio 2010 C 应用程序进行自动更新
- 为什么我的阵列没有更新
- STL 列表迭代器不会更新我的对象
- Tcl_LinkVar和Tcl_UpdateLinkedVar没有更新我的 TCL 变量
- 并行执行不更新我的变量
- 如何更新我的代码从终端Github
- 我如何确定为什么OpenGL入口点丢失后更新我的图形驱动程序
- 如何在Visual Studio 2015中更新我的c++项目以使用新的通用CRT