Zona de archivos de cabecera
#include <GLFW/glfw3.h>Lenguaje del código: texto plano (plaintext)
Incluye el archivo de cabecera de la librería de ventanas GLFW: se encarga de crear ventanas, gestionar entradas de ratón y teclado, administrar el contexto OpenGL y el bucle de mensajes de ventana.
GLFW es una librería desarrollada en C dedicada a crear y gestionar ventanas. Es independiente de ImGui pero necesaria para su funcionamiento, por lo que debemos incluirla. En la lección anterior ya la descargaste en la carpeta del proyecto y la configuraste.
#include "imgui.h"Lenguaje del código: texto plano (plaintext)
Archivo de cabecera central de ImGui, contiene todos los controles de interfaz, contextos, estilos y APIs básicas de renderizado.
#include "backends/imgui_impl_glfw.h"Lenguaje del código: texto plano (plaintext)
Puente entre ImGui y GLFW, transmite a ImGui la información de ventana, ratón, teclado y tamaño obtenida por GLFW.
#include "backends/imgui_impl_opengl3.h"
Capa de adaptación del backend de renderizado OpenGL3 para ImGui: genera shaders y búferes de vértices OpenGL, y envía los gráficos de la interfaz a la GPU para su dibujo.
#include <cstdio>
Librería estándar de entrada y salida C de C++, usada para imprimir registros de errores con printf.
int main()
Punto de entrada del programa, no hace falta explicar más.
Inicialización de GLFW
// Initialize GLFW
if (!glfwInit())
{
printf("GLFW initialization failed\n");
return -1;
}
glfwInit(): inicializa los recursos globales de GLFW (tarjeta gráfica, controladores de ventana, dispositivos de entrada).
Si falla la inicialización, se muestra un mensaje de error y se devuelve -1 para finalizar el programa de forma anómala; el sistema operativo detecta este código de error.
Configuración de versión OpenGL
// OpenGL 3.3
const char* glsl_version = "#version 330";
Define la cadena de versión del shader GLSL; OpenGL 3.3 corresponde a GLSL 330.
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
Establece la versión mayor de OpenGL en 3.
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
Establece la versión menor de OpenGL en 3.
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
Uso del perfil núcleo (Core Profile)
Creación de ventana
// Create window
GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);
La ventana mide 1000 × 600 píxeles y tiene el título «ImGui Minimal Demo (VS2022)». El cuarto parámetro nullptr indica el modo de ventana por defecto, el quinto sirve para indicar otra ventana que comparta contexto OpenGL; nullptr significa sin compartir.
El valor devuelto es un puntero de manejador de ventana GLFWwindow*.
if (!window)
{
glfwTerminate();
return -1;
}
Si falla la creación de ventana, el puntero window vale nullptr.
glfwTerminate() destruye todos los recursos reservados por GLFW.
Luego se devuelve -1 para avisar al sistema operativo que el programa terminó con error.
glfwMakeContextCurrent(window);
Vincula la ventana actual como contexto de renderizado OpenGL; todas las órdenes de dibujo OpenGL afectarán a esta ventana.
glfwSwapInterval(1);
Activa la sincronización vertical: el parámetro 1 espera cada refresco de pantalla para sincronizar la tasa de fotogramas y evitar el desgarro de imagen; 0 desactiva VSync sin límite de FPS.
Esta configuración es muy importante: si no se activa, el renderizado GLFW y el refresco de pantalla no coinciden y aparecen distorsiones visuales.
Inicialización global de ImGui
IMGUI_CHECKVERSION(); // Verifica coherencia de versiones entre cabecera y backend, error de aserción si no coinciden
ImGui::CreateContext(); // Crea el contexto global ImGui que almacena todo el estado de ejecución de la interfaz
ImGuiIO& io = ImGui::GetIO(); // Obtiene el objeto de configuración IO para gestionar entradas, fuentes y ajustes globales
ImGui::StyleColorsDark(); // Carga el tema oscuro oficial de ImGui
Vinculación del backend GLFW+OpenGL
ImGui_ImplGlfw_InitForOpenGL(window, true);
Si el segundo parámetro es true, ImGui toma el control de todos los eventos de entrada (ratón, teclado) y bloquea que las entradas pasen a la capa inferior del juego.
ImGui_ImplOpenGL3_Init(glsl_version);
Inicializa el backend de renderizado OpenGL3 con la cadena de versión GLSL recibida, compila los shaders de vértice/fragmento para dibujar la UI y crea los búferes GPU.
float slider_value = 0.5f; // Valor vinculado al control deslizante
int click_count = 0; // Contador de clics del botón
bool show_full_demo = false; // Controla si se muestra la ventana de demostración oficial de ImGui
Estas variables almacenan los valores de los controles, se leen y modifican en cada refresco de interfaz y mantienen su valor entre fotogramas.
Bucle de renderizado principal
Núcleo del programa, se ejecuta decenas o cientos de veces por segundo.
while (!glfwWindowShouldClose(window))
Mientras la ventana no reciba señal de cierre (clic en la X superior derecha o Alt+F4), se sigue renderizando.
glfwPollEvents();
Consulta todos los mensajes del sistema de ventanas: clics/movimientos de ratón, pulsaciones de teclas, redimensionado, cierre, etc.
ImGui_ImplOpenGL3_NewFrame();
Preprocesado del backend OpenGL por fotograma: reinicia recursos de renderizado y prepara el búfer para el siguiente fotograma.
ImGui_ImplGlfw_NewFrame();
Preprocesado del backend GLFW por fotograma: lee coordenadas actuales del ratón, estado de teclas y tamaño de ventana, y guarda los datos de entrada en el IO de ImGui.
ImGui::NewFrame();
Inicia el cálculo de disposición de un nuevo fotograma UI, debe llamarse antes de cualquier código de control ImGui::xxx(); borra internamente las órdenes de dibujo del fotograma anterior y prepara la recolección de datos del fotograma actual.
Sección de construcción de datos de controles UI
// Draw custom UI panel
ImGui::Begin("Control Panel"); // Abre una ventana de panel de control personalizado
ImGui::Text("Hello ImGui + VS2022"); // Muestra texto estático
ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f); // Control deslizante de coma flotante vinculado a variable
if (ImGui::Button("Click to Count")) // Crea botón de clic, devuelve true al pulsarlo
click_count++; // Aumenta el contador al pulsar el botón
ImGui::SameLine(); // Muestra el siguiente control en la misma línea
ImGui::Text("Click Count: %d", click_count); // Muestra el número de clics del botón
ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo); // Casilla para mostrar/ocultar ventana demo
ImGui::End(); // Finaliza el dibujo de la ventana personalizada actual
if (show_full_demo)
ImGui::ShowDemoWindow(&show_full_demo); // Abre la ventana de demostración completa oficial