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

时间:2008-09-24 08:29:03

标签: windows opengl windows-installer

我们有一个使用OpenGL的3D查看器,但我们的客户有时会抱怨它“不工作”。我们怀疑大多数这些问题源于他们试图在businiss笔记本电脑上使用现实的3D实时游戏。

我们如何在我们使用的windows msi安装程序中检查对openGL的支持?

作为旁注,如果你能回答“OpenGL支持的图形卡列表?”,那也会很有意思。奇怪,谷歌在这里没有帮助..

4 个答案:

答案 0 :(得分:9)

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

  1. 它根本没有安装/启动,因为缺少一些OpenGL支持。
  2. 它启动,但进一步崩溃。
  3. 它启动,不会崩溃,但渲染已损坏。
  4. 启动并正确呈现所有内容,但性能极差。
  5. 所有Windows版本(自95年起)都内置了OpenGL支持。因此,除非您的应用程序需要更高的OpenGL版本,否则不太可能导致上述情况1。

    但是,默认的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 :(得分:2)

我认为你可能在依赖简单地检查OpenGL的硬件支持方面存在问题,因为假设在过去10年内生产的每台笔记本电脑都能提供它,这是相当安全的。 (虽然如果这些笔记本电脑真的那么老,那么也许this wiki可能有帮助吗?)

但是,如果只是你的程序是图形密集型的,那么我可能会建议一个小的基准测试程序,以检查你的客户系统是否一开始就是最新的。您可以尝试here,看看您是否可以使用其中一种预先存在的基准测试工具来帮助您,或者您可以尝试为您的程序专门编写一个,例如:一个小的测试脚本,而不是模拟在繁重的负载下运行你的程序和记录信息,如FPS等 对于前者,您甚至可能会发现可以将测试运行集成到MSI安装程序中,但是我没有任何此类事情的经验。

希望你发现这些有用。

答案 2 :(得分: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。

答案 3 :(得分: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的更多信息,请参阅here

相关问题