【问题标题】:How to write an installer that checks for openGL support?如何编写检查 OpenGL 支持的安装程序?
【发布时间】:2010-09-12 15:59:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows opengl windows-installer


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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 代码 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 驱动程序错误,您必须找出并解决它们。很多工作。

      【讨论】:

        【解决方案3】:

        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

        【讨论】:

          猜你喜欢
          • 2020-06-10
          • 2015-12-14
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          • 2011-03-31
          • 1970-01-01
          相关资源
          最近更新 更多