OpenGL - Criando uma Janela


01 - 2023

Agora que sabemos que nosso ambiente está configurado e compilando, vamos utilizar o GLFW para criar uma janela. Como quero apenas fazer um teste para ver se está ok, vou copiar descaradamente o código da documentação do GLFW1

#include <iostream>
#include <GLFW/glfw3.h>

int main(void){
    GLFWwindow* window;

    if(!glfwInit()){
        return EXIT_FAILURE;
    }

    window = glfwCreateWindow(400, 300, "Hello GLFW", NULL, NULL);
    if(!window){
        glfwTerminate();
        return EXIT_FAILURE;
    }

    glfwMakeContextCurrent(window);

    while(!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);

        glfwPollEvents();
    }

    glfwTerminate();

    return EXIT_SUCCESS;

}

Se tudo deu certo, ao compilar e executar esse código teremos uma janela aberta no tamanho que definimos.

Vamos entender linha a linha o que está acontecendo no código que acabamos de fazer:

GLFWwindow* window;

Criamos uma referência (ponteiro) para a estrutura GLFWwindow do GLFW, esse objeto encapsula as operações de janela e de contexto do OpenGl em uma unica abstração.

if(!glfwInit()){

Antes de utilizarmos as funções do GLFW precisamos garantir sua inicialização correta. Se algum erro occorrer irá retornar GLFW_FALSE e caso isso ocorra finalizamos o programa.

window = glfwCreateWindow(400, 300, "Hello GLFW", NULL, NULL);

Aqui criamos uma Janela e um Contexto OpenGL, seus parametros são largura (width) em pixels, altura(height) em pixels e título da janela. Os dois ultimos parametros ficarão nulos (NULL), e não entraremos em detalhes pois são opções mais avançasdas. Mas são os parametros de Tela GLFWmonitor e o ultimo outro GLFWwindow.

As proximas duas linhas basicamente verificam se a janela conseguiu ser criada e caso contrario finaliza o GLFW glfwTerminate(), ou seja, libera os recursos que foram alocados pela glfwInit();

glfwMakeContextCurrent(window);

Quando criamos nossa janela, criamos uma janela e um contexto OpenGL, entretanto esse contexto ainda não está ativo. Essa função torna o contexto OpenGL ou OpenGL ES da janela especificada como o contexto atual.

O contexto atual do OpenGL se refere ao conjunto de estados e recursos gráficos associados a uma janela ou dispositivo de renderização específico em uma aplicação OpenGL.

glClear(GL_COLOR_BUFFER_BIT);

Está ai a nossa chamada para o OpenGL, esta função irá limpar o buffer para algum valor predefinido. No caso GL_COLOR_BUFFER_BIT que indica que esse é um buffer ativo para “escrita” de cor. Podemos fazer uma operação bitwise or para definir mais de uma possibilidade para o buffer. Iremos ver com calma mais adiante.

glfwSwapBuffers(window);

As janelas do GLFW são por padrão double bufered, ou seja, contém um buffer sendo mostrado (front buffer) enquanto o outro é renderizado (back buffer). Essa função troca esses buffers, mostrando o que estava sendo renderizado e reaproveitando o que estava sendo mostrado para um novo render.

glfwPollEvents();

Essa função processa apenas os eventos que já foram recebidos e, em seguida, retorna imediatamente. O processamento dos eventos fará com que as funções de retorno de chamada associadas à janela e à entrada (input) correspondentes a esses eventos sejam acionadas.

Ufa! Um código simples, só para abrir uma janela preta, mas bastante coisa para entender!!

Referências

  1. GLFW: An OpenGL Library