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

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

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

作为一个方面说明,如果你可以回答“支持OpenGL的graphics卡列表?”,这也将是greate。 奇怪,谷歌没有帮助在这里..

Solutions Collecting From Web of "如何编写一个检查openGL支持的安装程序?"

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

  1. 它不会安装/启动,因为缺少一些OpenGL支持。
  2. 它启动,但进一步崩溃。
  3. 它启动,不会崩溃,但渲染是腐败的。
  4. 它正确地启动和渲染一切,但性能是糟糕的。

所有Windows版本(从95开始)都有内置的OpenGL支持。 所以这不太可能导致上面的情况1),除非你的应用程序需要更高的OpenGL版本。

然而,这个默认的OpenGL实现是OpenGL1.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驱动程序错误,那么你必须弄清楚它们并解决它们。 很多工作。

我认为你可能只是依靠检查硬件支持OpenGL的问题,因为假定在过去的10年内制造的每一台笔记本电脑都提供了它,这是相当安全的。 (虽然如果这些笔记本电脑真的是那么古老,也许这个维基可能有帮助?)

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

希望你找到这些有用的。

自Windows NT或Win95以来,OpenGL是Windows的一部分。 你不可能找到一个没有预先安装OpenGL的Windows系统(例如Windows 3.1)

但是,您的应用程序可能需要比OpenGL 1.1更新版本的OpenGL更早版本的Windows。 你可以从你的程序中检查。 我不知道如何从msi中找到。

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

关于启用OpenGL的图形卡:都有OpenGL。 即使客户使用石器时代的ISA ET4000显卡,他至少也可以通过软件渲染来获得OpenGL 1.1。

Windows附带支持OpenGL 1.1(正如其他人在这里指出的那样)。 所以,你的用户面临的问题是由于在1.1之后被添加到OpenGL的扩展。 如果您使用的是GLEW库,那么通过编程来检查对所有扩展的支持是非常容易的。 以下是如何检查Occlusion Query的支持:

 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的更多信息,请参阅此处 。