Análise do exemplo ImGui

Á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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *