Pregunta

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 deben a que intentan utilizar lo que en realidad es un juego moderno en 3D en tiempo real en una computadora portátil de negocios.

¿Cómo podemos, en el instalador msi de Windows que utilizamos, verificar la compatibilidad con openGL?

Y como nota al margen, si puede responder "¿Lista de tarjetas gráficas compatibles con OpenGL?", También sería genial.Es extraño que Google no ayude aquí.

¿Fue útil?

Solución

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

  1. no se instala ni se inicia en absoluto debido a la falta de compatibilidad con OpenGL.
  2. se inicia, pero falla más adelante.
  3. se inicia, no falla, pero el procesamiento está corrupto.
  4. inicia y procesa todo correctamente, pero el rendimiento es abismal.

Todas las versiones de Windows (desde la 95) tienen compatibilidad con OpenGL incorporada.Por lo tanto, es poco probable que cause la situación 1) anterior, a menos que solicite requiere versión superior de OpenGL.

Sin embargo, esa implementación predeterminada de OpenGL es OpenGL 1.1 con renderizado de software.Si el usuario no instaló manualmente controladores compatibles con OpenGL (cualquier controlador descargado del sitio NVIDIA/AMD/Intel tendrá OpenGL), utilizará de forma predeterminada 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 decir lo menos.Es muy probable que varios errores en los controladores causen la situación 2), donde hacer algo válido provoca un bloqueo en el controlador.

Aquí hay un fragmento de código C++/WinAPI que crea un contexto OpenGL ficticio y recupera información (versión GL, 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 insertar ese código en su instalador o aplicación y al menos verificar que la versión GL sea 1.1;esto detectará la situación "el controlador no está instalado".Para solucionar los errores reales del controlador OpenGL, bueno, debe descubrirlos y solucionarlos.Mucho trabajo.

Otros consejos

Creo que podría tener problemas al confiar simplemente en verificar el soporte de hardware para OpenGL, ya que es bastante seguro asumir que todas las computadoras portátiles fabricadas en los últimos 10 años lo brindan.(Aunque si estas computadoras portátiles realmente son tan antiguas, entonces tal vez esta wiki ¿podría ayudar?)

Sin embargo, si su programa requiere un uso intensivo de gráficos, probablemente recomendaría un pequeño programa de referencia para verificar que los sistemas de sus clientes estén a la altura en primer lugar.Tu podrías intentar aquí, para ver si puede utilizar una de las herramientas de referencia preexistentes para ayudarle, o puede intentar escribir una para su programa específicamente, por ejemplo.un pequeño script de prueba que simula la ejecución de su programa bajo una carga pesada y registra información como FPS, etc.
Para el primero, es posible que incluso encuentres 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 los encuentres útiles.

OpenGL es parte de Windows desde Windows NT o Win95.Es poco probable que alguna vez encuentre un sistema Windows donde OpenGL no esté preinstalado (p. ej.Ventanas 3.1)

Sin embargo, es posible que su aplicación necesite una versión más reciente de OpenGL que el OpenGL 1.1 predeterminado que viene con versiones muy antiguas de Windows.Puedes comprobarlo desde tu programa.No sé cómo encontrarlo en msi.

Tenga en cuenta que OpenGL se actualiza a través de los controladores gráficos, no instalando un paquete de servicio o algo así.

Respecto a las tarjetas gráficas habilitadas para OpenGL:Todos tienen OpenGL.Incluso si el cliente utiliza una tarjeta gráfica ISA ET4000 de la Edad de Piedra, al menos tiene OpenGL 1.1 mediante renderizado de software.

Windows viene con soporte para OpenGL 1.1 (como otros han señalado aquí).Entonces, los problemas que enfrentan sus usuarios se deben a las extensiones que se agregaron a OpenGL después de la versión 1.1.Si está utilizando la biblioteca GLEW, es bastante fácil verificar la compatibilidad con todas las extensiones que está utilizando mediante programación.A continuación se explica cómo verificar la compatibilidad con 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;

Para obtener más información sobre el uso de GLEW, consulte aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top