Analyse de l’exemple ImGui

Section des fichiers d’en-tête

#include <GLFW/glfw3.h>Langage du code : Texte brut (plaintext)

Inclusion du fichier d’en-tête de la bibliothèque de fenêtres GLFW : responsable de la création des fenêtres, de la gestion des entrées souris/clavier, du contexte OpenGL et de la boucle de messages de fenêtre.

GLFW est une bibliothèque en langage C dédiée à la création et gestion de fenêtres. Elle est indépendante d’ImGui mais indispensable à son fonctionnement, c’est pourquoi nous devons l’inclure. Vous l’avez téléchargée dans le dossier du projet et configurée lors de la leçon précédente.

#include "imgui.h"Langage du code : Texte brut (plaintext)

Fichier d’en-tête central d’ImGui, il contient tous les widgets UI, contextes, styles et API de rendu basiques.

#include "backends/imgui_impl_glfw.h"Langage du code : Texte brut (plaintext)

Pont de connexion entre ImGui et GLFW, il transmet à ImGui les informations de fenêtre, souris, clavier et dimensions issues de GLFW.

#include "backends/imgui_impl_opengl3.h"Langage du code : Texte brut (plaintext)

Couche d’adaptation du backend de rendu OpenGL3 pour ImGui : génère les shaders et tampons de sommets OpenGL, puis transmet les graphismes de l’interface à la GPU pour l’affichage.

#include <cstdio>Langage du code : Texte brut (plaintext)

Bibliothèque d’entrée/sortie standard C de C++, utilisée pour afficher les journaux d’erreurs avec printf.


int main()Langage du code : Texte brut (plaintext)

Point d’entrée du programme, inutile de détailler davantage.

Initialisation de GLFW

    // Initialize GLFW
    if (!glfwInit())
    {
        printf("GLFW initialization failed\n");
        return -1;
    }Langage du code : Texte brut (plaintext)

glfwInit() : initialise les ressources globales de GLFW (carte graphique, pilotes de fenêtre, périphériques d’entrée).

Si l’initialisation échoue, un message d’erreur s’affiche et la fonction renvoie -1 pour arrêter le programme anormalement ; le système d’exploitation récupère ce code d’erreur.

Configuration de la version OpenGL

    // OpenGL 3.3
    const char* glsl_version = "#version 330";Langage du code : Texte brut (plaintext)

Définit la chaîne de version du shader GLSL ; OpenGL 3.3 correspond à GLSL 330.

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);Langage du code : Texte brut (plaintext)

Définit la version majeure d’OpenGL à 3.

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);Langage du code : Texte brut (plaintext)

Définit la version mineure d’OpenGL à 3.

 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);Langage du code : Texte brut (plaintext)

Utilisation du profil cœur (Core Profile)

Création de la fenêtre

    // Create window
    GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);Langage du code : Texte brut (plaintext)

La fenêtre mesure 1000 × 600 pixels avec le titre « ImGui Minimal Demo (VS2022) ». Le quatrième paramètre nullptr correspond au mode fenêtre par défaut, le cinquième permet de partager un contexte OpenGL avec une autre fenêtre ; nullptr signifie aucun partage.

La fonction renvoie un pointeur de handle de fenêtre GLFWwindow*.

 if (!window)
    {
        glfwTerminate();
        return -1;
    }Langage du code : Texte brut (plaintext)

Si la création échoue, le pointeur window vaut nullptr.

glfwTerminate() détruit toutes les ressources allouées par GLFW.

On renvoie ensuite -1 pour signaler au système d’exploitation un arrêt d’erreur.

glfwMakeContextCurrent(window);Langage du code : Texte brut (plaintext)

Lie la fenêtre actuelle au contexte de rendu OpenGL ; toutes les commandes de dessin OpenGL s’appliqueront à cette fenêtre.

glfwSwapInterval(1);Langage du code : Texte brut (plaintext)

Active la synchronisation verticale : le paramètre 1 attend chaque rafraîchissement de l’écran pour limiter la fréquence d’images et éviter le déchirement de l’image ; 0 désactive la VSync sans limitation de FPS.

Cette configuration est essentielle : sans synchronisation verticale, le rendu GLFW et le rafraîchissement de l’écran se décalent, ce qui provoque des distorsions visuelles.

Initialisation globale d’ImGui

IMGUI_CHECKVERSION(); // Vérifie la compatibilité des versions entre en-tête et backend, erreur d'assertion si versions différentes
ImGui::CreateContext(); // Crée le contexte global ImGui qui stocke tout l'état d'exécution de l'interface
ImGuiIO& io = ImGui::GetIO(); // Récupère l'objet de configuration IO pour gérer entrées, polices et paramètres globaux
ImGui::StyleColorsDark(); // Applique le thème sombre officiel d'ImGuiLangage du code : Texte brut (plaintext)

Liaison du backend GLFW+OpenGL

ImGui_ImplGlfw_InitForOpenGL(window, true);Langage du code : Texte brut (plaintext)

Si le second paramètre vaut true, ImGui capture tous les événements d’entrée souris/clavier et bloque leur transmission à la couche basse du jeu.

 ImGui_ImplOpenGL3_Init(glsl_version);Langage du code : Texte brut (plaintext)

Initialise le backend de rendu OpenGL3 avec la chaîne de version GLSL fournie, compile les shaders de sommets/fragments dédiés à l’UI et crée les tampons GPU.

float slider_value = 0.5f;    // Valeur liée au curseur
int click_count = 0;          // Compteur de clics sur le bouton
bool show_full_demo = false;  // Contrôle l'affichage de la fenêtre de démonstration officielle ImGuiLangage du code : Texte brut (plaintext)

Ces variables stockent les valeurs des widgets ; elles sont lues et modifiées à chaque rafraîchissement de l’interface et conservées entre les images.

Boucle de rendu principale

Cœur du programme, exécuté plusieurs dizaines à centaines de fois par seconde.

while (!glfwWindowShouldClose(window))Langage du code : Texte brut (plaintext)

Tant que la fenêtre ne reçoit pas de signal de fermeture (clic sur la croix en haut à droite ou Alt+F4), le rendu continue.

glfwPollEvents();Langage du code : Texte brut (plaintext)

Interroge tous les messages système de la fenêtre : clics/déplacements souris, appuis de touches, redimensionnement, fermeture, etc.

 ImGui_ImplOpenGL3_NewFrame();Langage du code : Texte brut (plaintext)

Pré-traitement du backend OpenGL par image : réinitialise les ressources de rendu et prépare le tampon pour l’image suivante.

ImGui_ImplGlfw_NewFrame();Langage du code : Texte brut (plaintext)

Pré-traitement du backend GLFW par image : lit les coordonnées souris, état des touches et dimensions fenêtre, puis alimente les données d’entrée IO d’ImGui.

ImGui::NewFrame();Langage du code : Texte brut (plaintext)

Débute le calcul de disposition de la nouvelle image UI, doit être appelé avant tout code de widget ImGui::xxx() ; efface les instructions de dessin de l’image précédente et prépare la collecte des données de l’image en cours.

Section de construction des données des widgets UI

// Draw custom UI panel
ImGui::Begin("Control Panel");                // Ouvre une fenêtre de panneau de contrôle personnalisée
ImGui::Text("Hello ImGui + VS2022");          // Affiche du texte statique
ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f); // Curseur à virgule flottante lié à une variable

if (ImGui::Button("Click to Count"))          // Crée un bouton, renvoie true si cliqué
    click_count++;                            // Incrémente le compteur à chaque clic
ImGui::SameLine();                            // Affiche le widget suivant sur la même ligne
ImGui::Text("Click Count: %d", click_count);  // Affiche le nombre de clics sur le bouton

ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo); // Case à cocher pour afficher/masquer la fenêtre démo
ImGui::End();                                 // Termine le rendu de la fenêtre personnalisée actuelle

if (show_full_demo)
    ImGui::ShowDemoWindow(&show_full_demo);    // Ouvre la fenêtre de démonstration complète officielle d'ImGuiLangage du code : Texte brut (plaintext)

Ce bloc dessine l’interface à chaque boucle, détecte les clics sur le bouton pour augmenter le compteur et afficher sa valeur.

Section de rendu graphique effectif

// Render ImGui draw data
ImGui::Render();                                        // Génère les données de dessin de sommets de l'image actuelle
int width, height;
glfwGetFramebufferSize(window, &width, &height);        // Récupère la résolution de rendu réelle de la fenêtre
glViewport(0, 0, width, height);                       // Définit la zone de visualisation OpenGL pour remplir toute la fenêtre
glClearColor(0.12f, 0.12f, 0.12f, 1.f);                // Définit la couleur de fond de nettoyage de la fenêtre (gris foncé)
glClear(GL_COLOR_BUFFER_BIT);                           // Efface le tampon de couleur de la fenêtre
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());// Dessine toute l'interface ImGui via OpenGL

glfwSwapBuffers(window);                                // Échange les tampons avant et arrière pour afficher l'image finaleLangage du code : Texte brut (plaintext)

Nettoyage des ressources à la fermeture

Le code ci-dessous libère toutes les ressources utilisées quand l’utilisateur ferme le programme.

// Cleanup resources
ImGui_ImplOpenGL3_Shutdown();  // Libère les ressources du backend OpenGL (shaders, tampons...)
ImGui_ImplGlfw_Shutdown();     // Libère les ressources du backend de liaison GLFW
ImGui::DestroyContext();       // Détruit le contexte global ImGui et libère la mémoire de l'interface
glfwDestroyWindow(window);     // Ferme la fenêtre GLFW et supprime son handle
glfwTerminate();               // Décharge complètement la bibliothèque GLFW, libère toutes ressources globales fenêtre/entrée
return 0;                      // Arrêt normal du programme, renvoie le code de succès 0Langage du code : Texte brut (plaintext)

L’ordre de destruction des ressources est inverse de l’ordre d’initialisation pour éviter les fuites mémoire et restes de ressources.

Voilà l’analyse complète de l’exemple de la leçon précédente. Si vous avez des questions, n’hésitez pas à commenter ci-dessous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *