6 Stimmen

Wie schreibt man ein Installationsprogramm, das auf OpenGL-Unterstützung prüft?

Wir haben einen 3D-Viewer, der OpenGL verwendet, aber unsere Kunden beschweren sich manchmal darüber, dass er "nicht funktioniert". Wir vermuten, dass die meisten dieser Probleme daher rühren, dass sie versuchen, ein modernes 3D-Echtzeitspiel auf einem Businiss-Laptop zu verwenden.

Wie können wir in dem von uns verwendeten Windows msi-Installationsprogramm prüfen, ob OpenGL unterstützt wird?

Und als Randbemerkung, wenn Sie "Liste der OpenGL unterstützten Grafikkarten?" beantworten können, wäre das auch toll. Seltsam, dass Google nicht hier helfen

10voto

NeARAZ Punkte 5897

Das hängt davon ab, was die Kunden mit "nicht funktionieren" meinen. Es könnte eines der folgenden sein:

  1. es lässt sich überhaupt nicht installieren/starten, weil einige OpenGL-Unterstützungen fehlen.
  2. startet er, stürzt aber im weiteren Verlauf ab.
  3. es wird gestartet, stürzt nicht ab, aber das Rendering ist fehlerhaft.
  4. er startet und rendert alles korrekt, aber die Leistung ist miserabel.

Alle Windows-Versionen (seit 95) haben OpenGL-Unterstützung eingebaut. Es ist also unwahrscheinlich, dass die obige Situation 1) auftritt, es sei denn, Sie wenden erfordert höhere OpenGL-Version.

Die Standard-OpenGL-Implementierung ist jedoch OpenGL 1.1 mit Software-Rendering . Wenn der Benutzer nicht manuell Treiber mit OpenGL-Unterstützung installiert hat (jeder von der NVIDIA/AMD/Intel-Website heruntergeladene Treiber verfügt über OpenGL), wird standardmäßig diese langsame und alte Implementierung verwendet. Dies ist sehr wahrscheinlich, um Situationen 3) und 4) oben verursachen.

Selbst wenn OpenGL verfügbar ist, sind die OpenGL-Treiber unter Windows nicht sehr robust, um es milde auszudrücken. Verschiedene Fehler in den Treibern sind sehr wahrscheinlich, um Situation 2), wo etwas gültig zu tun, verursacht einen Absturz in den Treiber.

Hier ist ein C++/WinAPI-Codefragment, das einen Dummy-OpenGL-Kontext erstellt und Informationen abruft (GL-Version, Grafikkartenname, Erweiterungen usw.):

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

Sie könnten diesen Code irgendwie in Ihr Installationsprogramm oder Ihre Anwendung einfügen und zumindest die GL-Version auf 1.1 überprüfen; dies wird die Situation "Treiber ist nicht installiert" erkennen. Um tatsächliche OpenGL-Treiber-Bugs zu umgehen, müssen Sie sie herausfinden und umgehen. Eine Menge Arbeit.

1voto

Nils Pipenbrinck Punkte 80152

OpenGL ist Teil von Windows seit Windows NT oder Win95. Es ist unwahrscheinlich, dass Sie jemals ein Windows-System finden werden, auf dem OpenGL nicht vorinstalliert ist (z.B. Windows 3.1)

Möglicherweise benötigt Ihre Anwendung jedoch eine neuere Version von OpenGL als die Standardversion OpenGL 1.1, die mit sehr alten Windows-Versionen geliefert wird. Sie können das in Ihrem Programm überprüfen. Ich wüsste nicht, wie man das in der msi herausfinden könnte.

Beachten Sie, dass OpenGL über die Grafiktreiber aktualisiert wird, nicht durch die Installation eines Service Packs oder ähnliches.

Bezüglich OpenGL-fähiger Grafikkarten: Alle haben OpenGL. Selbst wenn der Kunde eine ISA ET4000-Grafikkarte aus der Steinzeit verwendet, hat er zumindest OpenGL 1.1 über Software-Rendering.

1voto

Ashwin Nanjappa Punkte 72122

Windows wird mit Unterstützung für OpenGL 1.1 ausgeliefert (wie andere hier angemerkt haben). Die Probleme, mit denen Ihre Benutzer konfrontiert sind, sind also auf Erweiterungen zurückzuführen, die nach 1.1 zu OpenGL hinzugefügt wurden. Wenn Sie die GLEW-Bibliothek verwenden, ist es ziemlich einfach, die Unterstützung für alle Erweiterungen, die Sie verwenden, programmatisch zu überprüfen. Hier erfahren Sie, wie Sie die Unterstützung von Occlusion Query überprüfen können:

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;

Weitere Informationen zur Verwendung von GLEW finden Sie unter ici .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X