代码之家  ›  专栏  ›  技术社区  ›  Alexander Morland

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

  •  6
  • Alexander Morland  · 技术社区  · 18 年前

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

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

    作为补充说明,如果您可以回答“OpenGL支持的图形卡列表?”那也太好了。奇怪的是谷歌在这里没有帮助。

    4 回复  |  直到 17 年前
        1
  •  9
  •   NeARAZ    18 年前

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

    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++/WiAPI代码片段,它创建了一个哑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驱动程序错误,你必须解决它们。很多工作。

        2
  •  2
  •   Ross Anderson    18 年前

    我认为您可能会对仅仅依赖于检查OpenGL的硬件支持有问题,因为假设过去10年内制造的每台笔记本电脑都能提供它是相当安全的。(不过,如果这些笔记本真的那么旧,那么也许 this wiki 有帮助吗?)

    但是,如果只是你的程序是图形密集型的,那么我可能会推荐一个小的基准程序来检查你的客户系统是否达到了最初的标准。你可以试试 here ,查看您是否可以使用现有的基准工具之一来帮助您,或者您可以尝试为您的程序专门编写一个工具,例如一个小的测试脚本,而不是模拟在重负载下运行程序,并记录诸如fps等信息。
    对于前者,您甚至可能发现可以将一个测试运行集成到MSI安装程序中,但是我在这方面没有任何经验。

    希望你觉得这些有用。

        3
  •  1
  •   Nils Pipenbrinck    18 年前

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

    但是,您的应用程序可能需要较新版本的OpenGL,而不是默认的OpenGL 1.1,后者随Windows的旧版本一起提供。你可以从你的程序中检查它。我不知道怎么从微星找到它。

    请注意,OpenGL是通过图形驱动程序更新的,而不是通过安装一个服务包等方式更新的。

    关于启用OpenGL的图形卡:所有图形卡都有OpenGL。即使客户使用的是石器时代的ISAET4000图形卡,他至少通过软件渲染获得了OpenGL 1.1。

        4
  •  1
  •   Community Mohan Dere    9 年前

    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 .

    推荐文章