如何编写检查 OpenGL 支持的安装程序?

问题描述 投票:0回答:3

我们有一个使用 OpenGL 的 3D 查看器,但我们的客户有时会抱怨它“不起作用”。我们怀疑这些问题大部分源于他们尝试在商务笔记本电脑上使用实际上是现代 3D 实时游戏。

我们如何在我们使用的 Windows MSI 安装程序中检查对 OpenGL 的支持?

顺便说一句,如果您能回答“支持 OpenGL 的显卡列表?”,那就太好了。奇怪的是谷歌搜索在这里没有帮助......

windows opengl windows-installer
3个回答
10
投票

取决于客户所说的“不工作”是什么意思。它可能是以下之一:

  1. 它根本无法安装/启动,因为缺乏一些 OpenGL 支持。
  2. 它启动了,但进一步崩溃了。
  3. 它启动,不会崩溃,但渲染已损坏。
  4. 它可以正确启动并渲染所有内容,但性能很糟糕。

所有 Windows 版本(自 95 起)均内置 OpenGL 支持。所以不太可能导致上述情况1),除非您应用需要更高的OpenGL版本。

但是,默认的 OpenGL 实现是具有 软件渲染 的 OpenGL 1.1。如果用户没有手动安装支持 OpenGL 的驱动程序(从 NVIDIA/AMD/Intel 站点下载的任何驱动程序都将具有 OpenGL),他们将默认使用这种缓慢且旧的实现。这很可能会导致上述情况 3) 和 4)。

即使 OpenGL 可用,温和地说,Windows 上的 OpenGL 驱动程序也不是很强大。驱动程序中的各种错误很可能会导致情况 2),即执行有效操作会导致驱动程序崩溃。

这是一个 C++/WinAPI 代码片段,用于创建虚拟 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 驱动程序错误,您必须找出并解决它们。工作量很大。


1
投票

OpenGL 从 Windows NT 或 Win95 开始就是 Windows 的一部分。您不太可能找到未预装 OpenGL 的 Windows 系统(例如 Windows 3.1)

但是,您的应用程序可能需要比非常旧版本的 Windows 附带的默认 OpenGL 1.1 更新的 OpenGL 版本。您可以从您的程序中检查这一点。我不知道如何从 msi 找到它。

请注意,OpenGL 通过图形驱动程序进行更新,而不是通过安装服务包等进行更新。

关于启用 OpenGL 的显卡:所有显卡都具有 OpenGL。即使客户使用石器时代的 ISA ET4000 显卡,他至少也通过软件渲染拥有 OpenGL 1.1。


1
投票

Windows 附带了对 OpenGL 1.1 的支持(正如其他人在此处指出的那样)。因此,您的用户面临的问题是由于 1.1 之后添加到 OpenGL 的扩展造成的。如果您使用 GLEW 库,则可以很容易地以编程方式检查对您正在使用的所有扩展的支持。以下是检查是否支持遮挡查询的方法:

if (GLEW_OK != glewInit())
{
    // GLEW failed!
    exit(1);
}

// Check if required extensions are supported
if (!GLEW_ARB_occlusion_query)
    cout << "Occlusion query not supported" << endl;

有关使用 GLEW 的更多信息,请参阅此处

© www.soinside.com 2019 - 2024. All rights reserved.