2008-09-24 11 views
6

Tenemos un visor 3D que usa OpenGL, pero nuestros clientes a veces se quejan de que "no funciona". Sospechamos que la mayoría de estos problemas se debe a que intentan usar, lo que en realidad es un juego moderno en tiempo real en 3D, en una computadora portátil businiss.¿Cómo escribir un instalador que compruebe si admite OpenGL?

¿Cómo podemos, en el instalador msi de Windows que utilizamos, buscar soporte para openGL?

Y como nota al margen, si puede responder "Lista de tarjetas gráficas compatibles con OpenGL?", Eso también sería mejor. Extraño que Google no ayuda aquí ...

Respuesta

9

Depende de lo que los clientes quieren decir con "no funciona". Podría ser uno de los siguientes:

  1. no se instala/inicia en absoluto, debido a la falta de soporte OpenGL.
  2. se inicia, pero se bloquea más adelante.
  3. se inicia, no falla, pero la representación está dañada.
  4. se inicia y procesa todo correctamente, pero el rendimiento es abismal.

Todas las versiones de Windows (desde 95) tienen soporte para OpenGL incorporado. Por lo tanto, es poco probable que cause la situación 1) anterior, a menos que la aplicación requiera versión OpenGL más alta.

Sin embargo, esa implementación de OpenGL predeterminada es OpenGL 1.1 con software que representa.Si el usuario no instaló manualmente los controladores que tienen soporte para OpenGL (cualquier controlador descargado del sitio NVIDIA/AMD/Intel tendrá OpenGL), se aplicará de manera predeterminada a esta implementación lenta y antigua. Es muy probable que esto cause las situaciones 3) y 4) anteriores.

Incluso si OpenGL está disponible, en Windows los controladores OpenGL no son muy robustos, por decirlo suavemente. Varios errores en los controladores son muy propensos a causar la situación 2), donde hacer algo válido causa un bloqueo en el controlador.

Aquí hay un C++/WinAPI fragmento de código que crea un contexto OpenGL maniquí y recupera información (versión GL, el nombre de la tarjeta gráfica, extensiones, etc.):

// 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); 

de alguna manera podría conectar ese código en su instalador o aplicación y al menos comprobar la versión GL para ser 1.1; esto detectará la situación de "controlador no instalado". Para solucionar los errores reales del controlador de OpenGL, debe resolverlos y solucionarlos. Mucho trabajo.

1

OpenGL es parte de Windows desde Windows NT o Win95. Es poco probable que encuentre un sistema de Windows donde OpenGL no esté preinstalado (por ejemplo, Windows 3.1)

Sin embargo, su aplicación puede necesitar una versión más reciente de OpenGL que la predeterminada OpenGL 1.1 que viene con versiones muy antiguas de ventanas. Puede verificarlo desde su programa. No sé de ninguna manera cómo encontrar eso desde msi.

Tenga en cuenta que el OpenGL se actualiza a través de los controladores gráficos, no mediante la instalación de un paquete de servicio más o menos.

En cuanto a las tarjetas gráficas habilitadas para OpenGL: Todas tienen OpenGL. Incluso si el cliente usa una tarjeta gráfica ISA ET4000 de las edades de piedra, al menos tiene OpenGL 1.1 a través de software-rendering.

2

Creo que puede tener un problema al confiar en simplemente comprobar el soporte de hardware para OpenGL, ya que es bastante seguro suponer que cada computadora portátil fabricada en los últimos 10 años lo proporciona. (Aunque si estas laptops realmente son tan viejas entonces quizás this wiki podría ayudar?)

Sin embargo, si solo es que su programa es intensivo en gráficos, entonces probablemente recomendaría un pequeño programa de referencia para verificar que los sistemas de sus clientes estén funcionando arañar en primer lugar. Puede intentar here, para ver si puede utilizar una de las herramientas de referencia preexistentes para ayudarle, o puede intentar escribir una para su programa específicamente, p. un pequeño script de prueba que simula ejecutar su programa bajo una carga pesada y registra información como FPS, etc.
Para el primero, puede incluso encontrar que es posible integrar una ejecución de prueba en el instalador de MSI, sin embargo, no he tenido ninguna experiencia en este tipo de cosas.

Espero que les sea útil.

1

Windows se envía con soporte para OpenGL 1.1 (como otros lo han notado aquí). Por lo tanto, los problemas que enfrentan sus usuarios se deben a las extensiones que se han agregado a OpenGL después de 1.1. Si está utilizando la biblioteca GLEW, es bastante fácil verificar el soporte para todas las extensiones que está utilizando mediante programación. Aquí es cómo comprobar si el apoyo de la oclusión de consulta:

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; 

Para más información sobre el uso de Glew ver here.