ImGui Beispielanalyse

Header-Bereich

#include <GLFW/glfw3.h>Code-Sprache: Klartext (plaintext)

Einbinden des GLFW-Fensterbibliothek-Headers: Zuständig für Fenstererstellung, Maus-/Tastatureingabeverarbeitung, OpenGL-Kontextverwaltung und Fenster-Nachrichtenschleife.

GLFW ist eine in C geschriebene Bibliothek zur Erstellung und Verwaltung von Fenstern. Sie ist unabhängig von ImGui, aber zwingend erforderlich für dessen Betrieb, also muss sie eingebunden werden. Sie haben diese in der vorherigen Lektion in den Projektordner heruntergeladen und integriert.

#include "imgui.h"Code-Sprache: Klartext (plaintext)

Der zentrale Header von ImGui, enthält alle UI-Steuerelemente, Kontexte, Stile und grundlegende Zeichen-APIs.

#include "backends/imgui_impl_glfw.h"Code-Sprache: Klartext (plaintext)

Verbindungsstück zwischen ImGui und GLFW, leitet Fensterdaten, Maus-, Tastatur- und Fenstergrößeninformationen von GLFW an ImGui weiter.

#include "backends/imgui_impl_opengl3.h"

OpenGL3-Rendering-Backend-Anpassungsebene für ImGui: Erstellt OpenGL-Shader und Vertex-Puffer und übergibt die ImGui-Grafikdaten an die GPU zur Darstellung.

#include <cstdio>

C++ Standard-C-Ein-/Ausgabebibliothek, zur Ausgabe von Fehlerprotokollen mittels printf.


int main()

Einstiegspunkt des Programms, weitere Erklärung entfällt.

GLFW-Initialisierung

    // Initialize GLFW
    if (!glfwInit())
    {
        printf("GLFW initialization failed\n");
        return -1;
    }

glfwInit(): Initialisiert globale GLFW-Ressourcen (Grafikkarte, Fenstertreiber, Eingabegeräte).

Scheitert die Initialisierung, wird eine Fehlermeldung ausgegeben und -1 zurückgegeben für einen abnormalen Programmabbruch; das Betriebssystem erkennt diesen Fehlercode.

OpenGL-Versionskonfiguration

    // OpenGL 3.3
    const char* glsl_version = "#version 330";

Definiert die GLSL-Shader-Versionszeichenkette; OpenGL 3.3 entspricht GLSL 330.

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

Setzt die OpenGL-Hauptversion auf 3.

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

Setzt die OpenGL-Nebenversion auf 3.

 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

Verwendung des Core-Profil (Core Profile)

Fenster erstellen

    // Create window
    GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);

Das Fenster hat eine Größe von 1000 × 600 Pixel mit dem Titel „ImGui Minimal Demo (VS2022)“. Der vierte Parameter nullptr steht für den Standardfenstermodus, der fünfte gibt ein Fenster mit gemeinsamem OpenGL-Kontext an; nullptr bedeutet keine gemeinsame Nutzung.

Der Rückgabewert ist ein Fenster-Handle-Zeiger GLFWwindow*.

 if (!window)
    {
        glfwTerminate();
        return -1;
    }

Schlägt die Fenstererstellung fehl, ist der Zeiger window gleich nullptr.

glfwTerminate() zerstört alle von GLFW reservierten Ressourcen.

Anschließend wird -1 zurückgegeben, um dem Betriebssystem einen fehlerhaften Programmabbruch zu melden.

glfwMakeContextCurrent(window);

Bindet das aktuelle Fenster als OpenGL-Renderkontext; alle nachfolgenden OpenGL-Zeichenbefehle wirken auf dieses Fenster.

glfwSwapInterval(1);

Aktiviert die Vertikalsynchronisation: Parameter 1 wartet auf jede Bildschirmaktualisierung, synchronisiert die Bildrate mit der Bildschirmfrequenz und verhindert Bildschirmrisse; 0 deaktiviert VSync ohne FPS-Begrenzung.

Diese Einstellung ist äußerst wichtig: Ohne Aktivierung laufen GLFW-Rendering und Bildschirmaktualisierung asynchron, was zu verzerrten Bildern führt.

Globale ImGui-Initialisierung

IMGUI_CHECKVERSION(); // Prüft Versionskompatibilität zwischen Header und Backend, Assert-Fehler bei abweichenden Versionen
ImGui::CreateContext(); // Erstellt den globalen ImGui-Kontext, speichert alle Laufzustände der UI
ImGuiIO& io = ImGui::GetIO(); // Holt das IO-Konfigurationsobjekt zur Verwaltung von Eingaben, Schriftarten und globalen Schaltern
ImGui::StyleColorsDark(); // Lädt das offizielle dunkle UI-Farbschema

GLFW+OpenGL-Backend binden

ImGui_ImplGlfw_InitForOpenGL(window, true);

Bei zweitem Parameter true übernimmt ImGui alle Eingabeereignisse (Maus, Tastatur) und blockiert die Durchleitung von Eingaben an die untere Spielebene.

 ImGui_ImplOpenGL3_Init(glsl_version);

Initialisiert das OpenGL3-Rendering-Backend mit der übergebenen GLSL-Versionszeichenkette, kompiliert Vertex-/Fragment-Shader für die UI-Zeichnung und erstellt GPU-Puffer.

float slider_value = 0.5f;    // An den Schieberegler gebundener Zahlenwert
int click_count = 0;          // Zähler für Button-Klicks
bool show_full_demo = false;  // Steuert die Anzeige des offiziellen ImGui-Demofensters

Diese Variablen speichern die Werte der Steuerelemente, werden bei jedem UI-Refresh gelesen oder verändert und bleiben zwischen den Frames erhalten.

Hauptrendering-Schleife

Kernstück des Programms, wird mehrere Dutzend bis hundert Mal pro Sekunde ausgeführt.

while (!glfwWindowShouldClose(window))

Solange das Fenster kein Schließsignal erhält (Klick auf das X oben rechts oder Alt+F4), läuft das Rendering weiter.

glfwPollEvents();

Abrufen aller Fenstersystem-Nachrichten: Mausklicks/-bewegungen, Tastendrücke, Fenstergrößenänderungen, Schließen usw.

 ImGui_ImplOpenGL3_NewFrame();

OpenGL-Backend Vorverarbeitung pro Frame: Zurücksetzen von Renderressourcen, Vorbereiten des Zeichenpuffers für das nächste Bild.

ImGui_ImplGlfw_NewFrame();

GLFW-Backend Vorverarbeitung pro Frame: Auslesen aktueller Mauskoordinaten, Tastenzustände und Fenstergrößen, Schreiben in die ImGui IO-Eingabedaten.

ImGui::NewFrame();

Beginnt die Layoutberechnung für einen neuen UI-Frame, muss vor allen ImGui::xxx()-Steuerelementcode aufgerufen werden; löscht intern alle Zeichenbefehle des vorherigen Frames und bereitet das Sammeln von UI-Daten für den aktuellen Frame vor.

Bereich zum Erstellen von UI-Steuerelementdaten

// Draw custom UI panel
ImGui::Begin("Control Panel");                // Öffnet ein benutzerdefiniertes Steuerfenster
ImGui::Text("Hello ImGui + VS2022");          // Gibt statischen Text aus
ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f); // Gleitkomma-Schieberegler mit gebundener Variable

if (ImGui::Button("Click to Count"))          // Erstellt einen Klickbutton, gibt true bei Betätigung zurück
    click_count++;                            // Erhöht den Zähler bei jedem Klick
ImGui::SameLine();                            // Nächstes Steuerelement auf gleicher Zeile anzeigen
ImGui::Text("Click Count: %d", click_count);  // Gibt die Anzahl der Button-Klicks aus

ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo); // Checkbox zur Steuerung der Demofenster-Sichtbarkeit
ImGui::End();                                 // Beendet die Zeichnung des aktuellen benutzerdefinierten Fensters

if (show_full_demo)
    ImGui::ShowDemoWindow(&show_full_demo);    // Öffnet das vollständige offizielle ImGui-Demofenster

Dieser Block zeichnet bei jeder Schleife die Benutzeroberfläche, prüft auf Button-Klicks, erhöht den Zähler und gibt dessen Wert aus.

Tatsächlicher Rendering-Bereich

// Render ImGui draw data
ImGui::Render();                                        // Generiert Vertex-Zeichendaten für den aktuellen UI-Frame
int width, height;
glfwGetFramebufferSize(window, &width, &height);        // Ermittelt die tatsächliche Renderauflösung des Fensters
glViewport(0, 0, width, height);                       // Setzt OpenGL-Viewport auf gesamte Fenstergröße
glClearColor(0.12f, 0.12f, 0.12f, 1.f);                // Legt Fenster-Hintergrundfarbe fest (dunkelgrau)
glClear(GL_COLOR_BUFFER_BIT);                           // Leert den Farbpuffer der Zeichenfläche
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());// Zeichnet die gesamte ImGui-Oberfläche per OpenGL

glfwSwapBuffers(window);                                // Tauscht Vorder- und Hintergrundpuffer, zeigt das fertige Bild an

Ressourcenbereinigung nach Programmende

Der folgende Code säubert alle belegten Ressourcen, wenn der Nutzer das Programm schließt.

// Cleanup resources
ImGui_ImplOpenGL3_Shutdown();  // Gibt OpenGL-Rendering-Backend-Ressourcen frei (Shader, Puffer usw.)
ImGui_ImplGlfw_Shutdown();     // Gibt GLFW-Fensterbindungs-Backend-Ressourcen frei
ImGui::DestroyContext();       // Zerstört den globalen ImGui-Kontext, gibt UI-Speicher frei
glfwDestroyWindow(window);     // Schließt das GLFW-Fenster, entfernt das Fenster-Handle
glfwTerminate();               // Entlädt die GLFW-Bibliothek vollständig, gibt alle globalen Fenster-/Eingaberessourcen frei
return 0;                      // Normaler Programmabbruch, Rückgabe des Erfolgscodes 0

Die Reihenfolge der Ressourcenzerstörung ist genau umgekehrt zur Initialisierung, um Speicherlecks und verbleibende Ressourcen zu vermeiden.

Damit ist die Analyse des Beispiels aus der vorherigen Lektion abgeschlossen. Bei Fragen können Sie unten kommentieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert