<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Rina</title>
    <description>The latest articles on Forem by Rina (@mrsrina).</description>
    <link>https://forem.com/mrsrina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F899125%2F89f9d035-5840-45e3-83a0-c305e8e2154f.png</url>
      <title>Forem: Rina</title>
      <link>https://forem.com/mrsrina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mrsrina"/>
    <language>en</language>
    <item>
      <title>OpenGL - O que é?</title>
      <dc:creator>Rina</dc:creator>
      <pubDate>Sat, 30 Jul 2022 20:22:00 +0000</pubDate>
      <link>https://forem.com/mrsrina/opengl-o-que-e-2c04</link>
      <guid>https://forem.com/mrsrina/opengl-o-que-e-2c04</guid>
      <description>&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;glBegin&lt;/code&gt; &lt;code&gt;glEnd&lt;/code&gt; &lt;code&gt;glVertex2f&lt;/code&gt; &lt;code&gt;glPushMatrix&lt;/code&gt; 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.&lt;/p&gt;

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

&lt;p&gt;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 &lt;code&gt;GL&lt;/code&gt;, &lt;code&gt;glew&lt;/code&gt; e &lt;code&gt;glad&lt;/code&gt; - em Java &lt;code&gt;LWJGL&lt;/code&gt; - em Python &lt;code&gt;PyOpenGL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h1&gt;
  
  
  GPU
&lt;/h1&gt;

&lt;p&gt;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 &lt;code&gt;QUADS&lt;/code&gt; e &lt;code&gt;POLYGONS&lt;/code&gt;, isso foi descontinuado e atualmente as GPUs preferem trabalhar com apenas os 3 tipos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vertex buffer object&lt;/code&gt; ou os chamados &lt;code&gt;VBO&lt;/code&gt; 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 &lt;code&gt;mesh&lt;/code&gt;, mesh de vértices nada mais são do que &lt;code&gt;VBOs&lt;/code&gt; prontos.&lt;/p&gt;

&lt;p&gt;Aqui você vai ver como criarmos o &lt;code&gt;VBO&lt;/code&gt;, 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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;GLuint&lt;/span&gt; &lt;span class="n"&gt;vertex_buffer_object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;glGenBuffers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;vertex_buffer_object&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;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 &lt;code&gt;batch&lt;/code&gt;, &lt;code&gt;instanced rendering&lt;/code&gt; 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 &lt;code&gt;uniforms&lt;/code&gt; 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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// alocando o vbo etc, ativando a shader&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="n"&gt;shader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_uniform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;glBindBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_ARRAY_BUFFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vertex_buffer_object&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;glDrawArrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GL_TRIANGLES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// desenha&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#version 330 core

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

void main() {
   // código.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Se você quiser aprender OpenGL em outros lugares, recomendo os sites &lt;a href="https://developer.nvidia.com/gpugems/gpugems/contributors"&gt;Nvidia GPU Gems&lt;/a&gt; e também &lt;a href="https://learnopengl.com/"&gt;Learn OpenGL&lt;/a&gt;, a Nvidia também disponibiliza PDFs bem legais explicando funções do OpenGL, efeitos com shaders, etc.&lt;/p&gt;

&lt;h1&gt;
  
  
  The End
&lt;/h1&gt;

&lt;p&gt;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!&lt;/p&gt;

&lt;p&gt;~hi bye&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pxZniNnl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2ldv7qv7wxv2zuqmd3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pxZniNnl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2ldv7qv7wxv2zuqmd3m.png" alt="Image description" width="880" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>gamedev</category>
      <category>cpp</category>
      <category>opengl</category>
    </item>
  </channel>
</rss>
