Question

Nous avons un visualiseur 3D qui utilise OpenGL, mais nos clients se plaignent parfois que cela ne fonctionne pas. Nous pensons que la plupart de ces problèmes découlent de leur tentative d’utiliser, sur un ordinateur portable businiss, ce qui est en fait un jeu 3D temps réel moderne.

Comment pouvons-nous, dans le programme d'installation Windows msi que nous utilisons, vérifier la prise en charge d'OpenGL?

Et en guise de remarque, si vous pouvez répondre à la "Liste des cartes graphiques prises en charge par OpenGL?", cela serait également très utile. Étrange que google n’aide pas ici.

Était-ce utile?

La solution

Cela dépend de ce que les clients veulent dire par "ne travaillent pas". Ce pourrait être l'un des:

  1. cela n’installe pas / ne démarre pas du tout, à cause du manque de support OpenGL.
  2. il se lance, mais se bloque plus loin.
  3. il se lance, ne plante pas, mais le rendu est corrompu.
  4. il lance et restitue tout correctement, mais les performances sont catastrophiques.

Toutes les versions de Windows (depuis 95) ont un support OpenGL intégré. Il est donc peu probable que la situation 1) ci-dessus se produise, sauf si votre application requiert une version OpenGL supérieure.

Cependant, cette implémentation OpenGL par défaut est OpenGL 1.1 avec un rendu logiciel . Si l'utilisateur n'a pas installé manuellement les pilotes prenant en charge OpenGL (tout pilote téléchargé à partir du site NVIDIA / AMD / Intel aura OpenGL), il utilisera par défaut cette implémentation lente et ancienne. Cela risque fort de provoquer les situations 3) et 4) ci-dessus.

Même si OpenGL est disponible, sous Windows, les pilotes OpenGL ne sont pas très robustes, pour ne pas dire un peu. Divers bogues dans les pilotes sont très susceptibles de provoquer la situation 2), où faire quelque chose de valable provoque un crash du pilote.

Voici un extrait de code C ++ / WinAPI qui crée un contexte OpenGL factice et récupère des informations (version GL, nom de carte graphique, extensions, 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 );

Vous pouvez en quelque sorte brancher ce code sur votre programme d'installation ou votre application et au moins vérifier la version de GL pour la version 1.1; cela détectera " le pilote n’est pas installé " situation. Pour contourner les bogues des pilotes OpenGL, vous devez les résoudre et les résoudre. Beaucoup de travail.

Autres conseils

Je pense que vous pourriez avoir du mal à vous fier à la simple vérification du support matériel pour OpenGL car il est relativement prudent de supposer que chaque ordinateur portable fabriqué au cours des 10 dernières années le fournit. (Bien que si ces ordinateurs portables soient vraiment vieux, alors peut-être ce wiki pourrait aide?)

Toutefois, si votre programme nécessite beaucoup de ressources graphiques, je vous recommanderais probablement un petit programme de référence pour vérifier que les systèmes de vos clients sont à la pointe de la technologie. Vous pouvez essayer ici pour voir si vous pouvez utiliser l'un des outils de référence préexistants. pour vous aider, ou vous pouvez essayer d’en écrire un spécifiquement pour votre programme, par exemple un petit script de test qui simule l'exécution de votre programme sous une charge importante et enregistre des informations telles que FPS, etc.

Dans le premier cas, il est même possible d’intégrer un programme d’essai dans le programme d’installation MSI, mais je n’ai aucune expérience de ce type.

J'espère que vous les trouverez utiles.

OpenGL fait partie de Windows depuis Windows NT ou Win95. Il est peu probable que vous trouviez un système Windows sur lequel OpenGL n'est pas préinstallé (Windows 3.1, par exemple)

Toutefois, votre application peut nécessiter une version d'OpenGL plus récente que la version par défaut d'OpenGL 1.1, livrée avec de très anciennes versions de Windows. Vous pouvez vérifier cela dans votre programme. Je ne sais pas comment trouver ça à partir de msi.

Notez que OpenGL est mis à jour via les pilotes graphiques, pas en installant un service pack ou autre.

Concernant les cartes graphiques compatibles OpenGL: tous ont OpenGL. Même si le client utilise une carte graphique ISA ET4000 de l'âge de pierre, il dispose au moins d'OpenGL 1.1 via un logiciel de rendu.

Windows est livré avec le support d’OpenGL 1.1 (comme d’autres l’ont noté ici). Ainsi, les problèmes auxquels vos utilisateurs sont confrontés sont dus aux extensions qui ont été ajoutées à OpenGL après la 1.1. Si vous utilisez la bibliothèque GLEW, il est assez facile de vérifier la prise en charge de toutes les extensions que vous utilisez par programme. Voici comment vérifier le support d'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;

Pour plus d'informations sur l'utilisation de GLEW, voir ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top