OpenGL é uma API gráfica que possui várias versões, cada uma introduzindo novos recursos e funcionalidades. Para utilizar essas funcionalidades mais recentes, é necessário carregar as funções específicas da versão em tempo de execução com uso de bibliotecas:
A GLAD é uma biblioteca utilizada para gerar carregadores de funções OpenGL. Ele ajuda a carregar as funções específicas da versão do OpenGL que você está usando em tempo de execução.
GLFW é uma biblioteca que oferece suporte para a criação de janelas, tratamento de entrada e gerenciamento de contexto OpenGL. Ele facilita a configuração de uma janela e de um contexto OpenGL, mas não lida diretamente com a carga de funções OpenGL.
O GLFW, SDL2, SFML ou similares podem ser usados em conjunto com o OpenGL para facilitar o gerenciamento da janela e do contexto OpenGL enquanto você se concentra nas operações gráficas em si.
O Vulkan(desenvolvido também pela mesma empresa, a Khronos Group) e o Direct3D são alternativas ao OpenGL.
Nesse vídeo veremos:
Código do arquivo task.json
:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:/path/to/g++.exe",
"args": [
"-g",
"-std=c++17",
"-I${workspaceFolder}/include",
"-L${workspaceFolder}/lib",
"${workspaceFolder}/src/main.cpp",
"${workspaceFolder}/src/glad.c",
"-lglfw3dll",
"-o",
"${workspaceFolder}/cutable.exe"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: C:/C:/path/to/g++.exe"
}
]
}
Código do main.cpp
:
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height){
glViewport(0, 0, width, height);
}
int main(){
if (!glfwInit()){
std::cout << "Failed to initialize GLFW.\n";
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window;
window = glfwCreateWindow(800, 600, "C++ OpenGL on Windows", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to open GLFW window.\n";
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
std::cout << "Failed to initialize GLAD.\n";
return -1;
}
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
while(!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Comando para compilar:
g++ -g -std=c++17 -I include -L lib main.cpp src/glad.c -lglfw3dll
Rode os comandos abaixo para instalar:
sudo apt update
sudo apt install pkg-config libgl1-mesa-dev freeglut3-dev libglfw3 libglfw3-dev
Código do main.cpp
e ao final do arquivo formas para compilar:
#include <GLFW/glfw3.h>
int main(){
// Inicialize a biblioteca
if (!glfwInit()){
return -1;
}
// Crie uma janela em 'modo de janela' e seu contexto OpenGL
GLFWwindow* window = glfwCreateWindow(800, 450, "C++ OpenGL", NULL, NULL);
// Importante verificar, pois o servidor de janelas pode veriar de acordo com o sistema operacional
if (!window) {
glfwTerminate();
return -1;
}
// Tornar o contexto da janela atual
glfwMakeContextCurrent(window);
// Loop até que o usuário feche a janela
while (!glfwWindowShouldClose(window)){
// Renderizar aqui
glClear(GL_COLOR_BUFFER_BIT);
// Troca os buffers de cor para exibição correta
glfwSwapBuffers(window);
// Escutar eventos: mouse, teclado, fechar janela,...
glfwPollEvents();
}
// Importante para deletar todos os ponteiros criados
glfwTerminate();
return 0;
}
// Pode ser que no Ubuntu a ordem importe! Passe os arquivos .cpp primeiro e as flags por último:
// g++ main.cpp $(pkg-config --libs --cflags glfw3) -lGL
// Ou
// g++ main.cpp -lglfw -lGL -lX11 -lpthread -lXrandr -ldl