Área dos arquivos de cabeçalho
#include <GLFW/glfw3.h>Code language: plaintext (plaintext)
Inclui o cabeçalho da biblioteca de janelas GLFW: responsável por criar janelas, processar entrada de mouse/teclado, gerenciar o contexto OpenGL e o loop de mensagens da janela.
A GLFW é uma biblioteca em linguagem C focada em criação e gerenciamento de janelas. Ela é independente da ImGui, mas obrigatória para seu funcionamento, por isso precisamos importá-la. Você já baixou ela na pasta do projeto e configurou a integração na aula anterior.
#include "imgui.h"Code language: plaintext (plaintext)
Esse é o cabeçalho principal da ImGui, contendo todos os componentes de interface, contextos, estilos e APIs básicas de renderização.
#include "backends/imgui_impl_glfw.h"Code language: plaintext (plaintext)
Ponte de ligação entre ImGui e GLFW, transmite para ImGui os dados da janela, posição do mouse, teclas e tamanho da tela capturados pela GLFW.
#include "backends/imgui_impl_opengl3.h"Code language: plaintext (plaintext)
Camada de adaptação do backend de renderização OpenGL3 para ImGui: gera shaders e buffers de vértices OpenGL, envia os gráficos da interface para a GPU desenhar.
#include <cstdio>Code language: plaintext (plaintext)
Biblioteca padrão de entrada e saída C do C++, usada para imprimir logs de erro com a função printf.
int main()Code language: plaintext (plaintext)
Ponto de entrada do programa, dispensa maiores explicações.
Inicialização da GLFW
// Initialize GLFW
if (!glfwInit())
{
printf("GLFW initialization failed\n");
return -1;
}Code language: plaintext (plaintext)
glfwInit(): inicializa os recursos globais da GLFW (placa de vídeo, drivers de janela, dispositivos de entrada).
Se a inicialização falhar, uma mensagem de erro é exibida e retorna -1 para encerrar o programa de forma anormal; o sistema operacional detecta esse código de erro.
Configuração da versão OpenGL
// OpenGL 3.3
const char* glsl_version = "#version 330";Code language: plaintext (plaintext)
Define a string de versão do shader GLSL; OpenGL 3.3 corresponde ao GLSL 330.
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);Code language: plaintext (plaintext)
Define a versão principal do OpenGL como 3.
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);Code language: plaintext (plaintext)
Define a versão secundária do OpenGL como 3.
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);Code language: plaintext (plaintext)
Uso do Perfil Principal (Core Profile)
Criação da janela
// Create window
GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);Code language: plaintext (plaintext)
A janela tem resolução de 1000×600 pixels e título “ImGui Minimal Demo (VS2022)”. O quarto parâmetro nullptr representa o modo de janela padrão, o quinto serve para indicar uma janela compartilhando contexto OpenGL; nullptr significa sem compartilhamento.
O retorno é um ponteiro de identificador de janela GLFWwindow*.
if (!window)
{
glfwTerminate();
return -1;
}Code language: plaintext (plaintext)
Se a criação da janela falhar, o ponteiro window receberá o valor nullptr.
glfwTerminate() destrói todos os recursos alocados pela GLFW.
Depois retorna -1 para informar ao sistema operacional que o programa fechou com erro.
glfwMakeContextCurrent(window);Code language: plaintext (plaintext)
Vincula a janela atual como contexto de renderização OpenGL; todos os comandos de desenho OpenGL afetam essa janela.
glfwSwapInterval(1);Code language: plaintext (plaintext)
Ativa a sincronização vertical: parâmetro 1 espera cada atualização da tela para sincronizar taxa de quadros e evitar rasgos visuais; 0 desliga o VSync sem limite de FPS.
Essa configuração é muito importante: sem ela, a renderização GLFW e a atualização da tela ficam dessincronizadas, causando distorções na imagem.
Inicialização global da ImGui
IMGUI_CHECKVERSION(); // Verifica compatibilidade de versão entre cabeçalho e backend, lança erro de asserção se houver diferença
ImGui::CreateContext(); // Cria o contexto global da ImGui, armazena todo o estado de execução da interface
ImGuiIO& io = ImGui::GetIO(); // Obtém o objeto de configuração IO para gerenciar entradas, fontes e switches globais
ImGui::StyleColorsDark(); // Carrega o tema escuro oficial da ImGuiCode language: plaintext (plaintext)
Vinculação do backend GLFW+OpenGL
ImGui_ImplGlfw_InitForOpenGL(window, true);Code language: plaintext (plaintext)
Quando o segundo parâmetro é true, a ImGui assume todos os eventos de entrada (mouse, teclado) e bloqueia que esses dados passem para a camada inferior do jogo.
ImGui_ImplOpenGL3_Init(glsl_version);Code language: plaintext (plaintext)
Inicializa o backend de renderização OpenGL3 recebendo a string de versão GLSL, compila shaders de vértice/fragmento para desenho de interface e cria buffers da GPU.
float slider_value = 0.5f; // Valor vinculado ao controle deslizante
int click_count = 0; // Contador de cliques no botão
bool show_full_demo = false; // Controla exibição da janela de demonstração oficial da ImGuiCode language: plaintext (plaintext)
Essas variáveis armazenam os valores dos componentes, são lidas e modificadas a cada atualização de interface e mantêm o valor entre quadros.
Loop principal de renderização
Núcleo do programa, executado de dezenas a centenas de vezes por segundo.
while (!glfwWindowShouldClose(window))Code language: plaintext (plaintext)
Enquanto a janela não receber sinal de fechamento (clique no X superior direito ou Alt+F4), a renderização continua rodando.
glfwPollEvents();Code language: plaintext (plaintext)
Varre todas as mensagens do sistema de janelas: clique/movimento de mouse, pressionamento de teclas, redimensionamento, fechamento e mais.
ImGui_ImplOpenGL3_NewFrame();Code language: plaintext (plaintext)
Pré-processamento do backend OpenGL por quadro: reinicia recursos de renderização e prepara o buffer para o próximo quadro.
ImGui_ImplGlfw_NewFrame();Code language: plaintext (plaintext)
Pré-processamento do backend GLFW por quadro: lê coordenadas atuais do mouse, estado das teclas e tamanho da janela, grava esses dados de entrada no IO da ImGui.
ImGui::NewFrame();Code language: plaintext (plaintext)
Inicia o cálculo de layout para um novo quadro de interface, deve ser chamado antes de qualquer código de componente ImGui::xxx(); limpa internamente os comandos de desenho do quadro anterior e prepara a coleta de dados do quadro atual.
Área de montagem dos dados dos componentes UI
// Draw custom UI panel
ImGui::Begin("Control Panel"); // Abre janela de painel de controle personalizado
ImGui::Text("Hello ImGui + VS2022"); // Exibe texto estático
ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f); // Controle deslizante de ponto flutuante ligado à variável
if (ImGui::Button("Click to Count")) // Cria botão de clique, retorna true ao ser pressionado
click_count++; // Incrementa contador ao clicar no botão
ImGui::SameLine(); // Exibe o próximo componente na mesma linha
ImGui::Text("Click Count: %d", click_count); // Mostra o número de cliques no botão
ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo); // Caixa de seleção para alternar visibilidade da janela demo
ImGui::End(); // Encerra o desenho da janela personalizada atual
if (show_full_demo)
ImGui::ShowDemoWindow(&show_full_demo); // Abre a janela completa de demonstração oficial da ImGuiCode language: plaintext (plaintext)
Esse bloco desenha a interface a cada loop, detecta cliques no botão para incrementar o contador e exibir o valor.
Área de renderização efetiva
// Render ImGui draw data
ImGui::Render(); // Gera os dados de desenho de vértices do quadro atual
int width, height;
glfwGetFramebufferSize(window, &width, &height); // Obtém a resolução real de renderização da janela
glViewport(0, 0, width, height); // Define a área de visualização OpenGL para ocupar toda a janela
glClearColor(0.12f, 0.12f, 0.12f, 1.f); // Define a cor de limpeza da janela (cinza escuro)
glClear(GL_COLOR_BUFFER_BIT); // Limpa o buffer de cor da tela
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());// Desenha toda a interface ImGui via OpenGL
glfwSwapBuffers(window); // Troca o buffer frontal e traseiro para exibir a imagem finalCode language: plaintext (plaintext)
Liberação de recursos após encerramento
O código abaixo limpa todos os recursos utilizados quando o usuário fecha o programa.
// Cleanup resources
ImGui_ImplOpenGL3_Shutdown(); // Libera recursos do backend OpenGL (shaders, buffers e etc)
ImGui_ImplGlfw_Shutdown(); // Libera recursos do backend de ligação com GLFW
ImGui::DestroyContext(); // Destrói o contexto global da ImGui, libera memória da interface
glfwDestroyWindow(window); // Fecha a janela GLFW e remove seu identificador
glfwTerminate(); // Descarrega totalmente a biblioteca GLFW, libera todos os recursos globais de janela/entrada
return 0; // Encerramento normal do programa, retorna código de sucesso 0Code language: plaintext (plaintext)
A ordem de destruição dos recursos é inversa à ordem de inicialização, evitando vazamento de memória e resíduos de recursos.
Pronto, finalizamos a análise do exemplo da aula anterior. Se tiver alguma dúvida, deixe um comentário abaixo.
