取决于客户所说的“不工作”是什么意思。它可能是以下之一:
- 它根本无法安装/启动,因为缺少一些 OpenGL 支持。
- 它启动,但进一步崩溃。
- 它会启动,不会崩溃,但渲染已损坏。
- 它可以正确启动和渲染所有内容,但性能极差。
所有 Windows 版本(自 95 起)都内置了 OpenGL 支持。因此不太可能导致上述情况 1),除非您的应用程序需要更高的 OpenGL 版本。
然而,默认的 OpenGL 实现是带有软件渲染的 OpenGL 1.1。如果用户没有手动安装支持 OpenGL 的驱动程序(从 NVIDIA/AMD/Intel 站点下载的任何驱动程序都将具有 OpenGL),他们将默认使用这种缓慢而旧的实现。这很可能导致上述情况 3) 和 4)。
即使 OpenGL 可用,在 Windows 上,OpenGL 驱动程序也不是很健壮,委婉地说。驱动程序中的各种错误很可能导致情况 2),在这种情况下,执行有效的操作会导致驱动程序崩溃。
这是一个 C++/WinAPI 代码 sn-p,它创建一个虚拟 OpenGL 上下文并检索信息(GL 版本、显卡名称、扩展等):
// setup minimal required GL
HWND wnd = CreateWindow(
"STATIC",
"GL",
WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, 16, 16,
NULL, NULL,
AfxGetInstanceHandle(), NULL );
HDC dc = GetDC( wnd );
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA, 32,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
16, 0,
0, PFD_MAIN_PLANE, 0, 0, 0, 0
};
int fmt = ChoosePixelFormat( dc, &pfd );
SetPixelFormat( dc, fmt, &pfd );
HGLRC rc = wglCreateContext( dc );
wglMakeCurrent( dc, rc );
// get information
const char* vendor = (const char*)glGetString(GL_VENDOR);
const char* renderer = (const char*)glGetString(GL_RENDERER);
const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
const char* version = (const char*)glGetString(GL_VERSION);
// DO SOMETHING WITH THOSE STRINGS HERE!
// cleanup
wglDeleteContext( rc );
ReleaseDC( wnd, dc );
DestroyWindow( wnd );
您可以以某种方式将该代码插入您的安装程序或应用程序,并至少检查 GL 版本是否为 1.1;这将检测“未安装驱动程序”的情况。要解决实际的 OpenGL 驱动程序错误,您必须找出并解决它们。很多工作。