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!!