DEV Community 👩‍💻👨‍💻

Rina
Rina

Posted on

OpenGL - O que é?

Nós devs sempre nos deparamos com esse nome no nosso dia a dia, seja um jogo, editor de vídeo, ferramenta de modelagem 3D, motor de jogos... E aliás quem nunca tentou baixar OpenGL?

OpenGL é uma API gráfica e a partir dela conseguimos gerar desenhos na tela de forma acelerada, ou seja, é ela quem se comunica diretamente com o driver da placa de vídeo. Todas as funções do OpenGL dependem da implementação do driver e. g Nvidia disponibiliza os drivers para suas GPUs, com isso é possível utilizar as funções do OpenGL compatíveis com o modelo.

OpenGL não é diferente de DirectX ou Vulkan, se formos olhar para o que cada uma faz visto que DirectX também conversa com a GPU, existe os mesmos conceitos que o OpenGL trabalha, afinal se trata de como o driver implementa e não dá API em especifico.

Existem diferentes versões do OpenGL, a comunidade caracterizou elas de duas formas: legacy e moderno; O motivo é pela descontinuação de algumas funções como glBegin glEnd glVertex2f glPushMatrix etc, nas versões iniciais do OpenGL você não podia alterar o que estava na GPU e só realocando novos buffers (reenviando dados para a GPU), mas isso foi resolvido com a implementação de mini-programas (shaders) que rodam dentro da GPU e podem ser totalmente programáveis, assim em diante as versões foram nomeadas OpenGL moderno pela comunidade.

Dentre as versões modernas são: OpenGL ES2/3 que é feita para sistemas embarcados (sistemas Android, consoles etc) - Outra versão é a WebGL, uma API feita em Java Script e é usada em navegadores - Por fim temos a versão "desktop" OpenGL 3/4, a maioria dos sistemas e arquiteturas utilizam.

Se você buscar algum tutorial pela internet e ver as tais funções descontinuadas sendo usadas, acredite em mim é uma furada e perda de tempo. Para você programar com OpenGL você necessita de uma binding para a linguagem, em C++ as mais usadas são GL, glew e glad - em Java LWJGL - em Python PyOpenGL.

--

GPU

Em computação gráfica, OpenGL e outras APIs gráficas são utilizadas, como eu tinha dito OpenGL desenha coisas na tela, a nossa GPU adora 3 tipos de primitivos: pontos, linhas e triangulo; Em versões legacy do OpenGL você tinha a possibilidade de renderizar QUADS e POLYGONS, isso foi descontinuado e atualmente as GPUs preferem trabalhar com apenas os 3 tipos.

vertex buffer object ou os chamados VBO são buffers (listas) que podem armazenar qualquer tipo de dado, desde que seja utilizado pela GPU. Toda vez que queremos desenhar algo na GPU precisamos preparar esses buffers, isso também é conhecido como mesh, mesh de vértices nada mais são do que VBOs prontos.

Aqui você vai ver como criarmos o VBO, mas só criarmos, isso não vai ter nenhum efeito se não dizermos para a GPU desenhar e nem se quisermos pelo fato de não termos alocados nada no buffer.

GLuint vertex_buffer_object;
glGenBuffers(1, &vertex_buffer_object);
Enter fullscreen mode Exit fullscreen mode

É um exemplo simples, o foco aqui é entender o que é OpenGL e não como programar (talvez eu poste tutoriais aqui).

As shaders utilizam dos VBOs para obter dados da CPU (código que você criou) e o nome disso é alocar buffers, isso custa muito uso da CPU se você alocar toda hora, mas ai que entra conceitos como batch, instanced rendering etc. Esses conceitos são algoritmos e features que resolvem esse problema de performance, em versões antigas legacy do OpenGL você podia também alocar poucas vezes, mas não existia a possibilidade de alterar os buffers de forma eficaz (a não ser realocar os buffers). As shaders usam dos uniforms que nada mais são do que variáveis globais que guardam um valor de forma dinâmica, ou seja, você defini o valor em um loop antes de desenhar um buffer.

// alocando o vbo etc, ativando a shader
// ...
shader.set_uniform("width", 50);

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
glDrawArrays(GL_TRIANGLES, 0, 6); // desenha
Enter fullscreen mode Exit fullscreen mode

Como eu disse, shaders são programáveis, elas são compiladas e guardadas dentro do runtime do seu programa e são executadas dentro da GPU, assim você pode manipular o que estiver na GPU acessando as shaders pela CPU.

#version 330 core

layout (location = 0) in vec2 attrib_pos;
uniform float width;

void main() {
   // código.
}
Enter fullscreen mode Exit fullscreen mode

Entretanto você até agora não entendeu é nada, mas isso foi um pouco do que OpenGL é capaz, obviamente que existem inúmeras coisas que deixei passar nesse post, lembrando eu só quero mostrar o OpenGL e não ensinar a usar OpenGL.

Se você quiser aprender OpenGL em outros lugares, recomendo os sites Nvidia GPU Gems e também Learn OpenGL, a Nvidia também disponibiliza PDFs bem legais explicando funções do OpenGL, efeitos com shaders, etc.

The End

Bom acabou, espero que goste de ter lido e se gostar posso trazer realmente tutorias sobre OpenGL moderno, conceitos utilizando OpenGL e também outras coisas relacionada a game-dev, até mesmo como criar sua API de GUI (isso mesmo sua do 0) em código de alta performance!

~hi bye

Image description

Top comments (6)

Collapse
 
2formaggi profile image
João Henrique de Souza

Muito legal o conteúd Rhina gostaria muito de aprender mais sobre openGl espero que possa continuar compartilhando seu conhecimento!

Collapse
 
mrsrina profile image
Rina Author

!!! Muito legal, não existe muito material didático em Português, vou elaborar uns posts sobre OpenGL e trazer exemplos práticos em 2D (mas nada de desenhar triangulo não k).

Collapse
 
2formaggi profile image
João Henrique de Souza

Massa estarei esperando hehehe, você tem algum material que recomenda para estudar C++ moderno?

Thread Thread
 
mrsrina profile image
Rina Author

Em português não, mas no Youtube existe alguns vídeos interessantes, Microsoft tbm tem sua documentação (acho q baseada nas regras do MSVC)

Thread Thread
 
2formaggi profile image
João Henrique de Souza

Vlw

Collapse
 
raulchatter profile image
RaulChatter

great concept its will help me keep sharing more post like this . I love him I want a dua to get him back

🌚 Browsing with dark mode makes you a better developer.

It's a scientific fact.