<?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>DEV Community: Exequiel Pagliari</title>
    <description>The latest articles on DEV Community by Exequiel Pagliari (@exequiel_pagliari).</description>
    <link>https://dev.to/exequiel_pagliari</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%2F3913966%2Ff46f314e-8660-41f5-bea0-0d063bcfaede.png</url>
      <title>DEV Community: Exequiel Pagliari</title>
      <link>https://dev.to/exequiel_pagliari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/exequiel_pagliari"/>
    <language>en</language>
    <item>
      <title>Entendiendo VAO y VBO desde C/C++</title>
      <dc:creator>Exequiel Pagliari</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:58:07 +0000</pubDate>
      <link>https://dev.to/exequiel_pagliari/entendiendo-vao-y-vbo-desde-cc-55ll</link>
      <guid>https://dev.to/exequiel_pagliari/entendiendo-vao-y-vbo-desde-cc-55ll</guid>
      <description>&lt;p&gt;Uno de los temas que más me cuestan de OpenGL está muy relacionado con conceptos de manejo de memoria y tipos de datos de C/C++. La complejidad surge, en parte, porque existen dos recursos estrechamente relacionados dentro del proceso de carga y consumo de datos por parte de la GPU: VAO y VBO.&lt;/p&gt;

&lt;p&gt;VAO son las siglas de &lt;em&gt;Vertex Array Object&lt;/em&gt;. Un VAO no almacena los datos de los vértices. Su función es describir cómo deben interpretarse los datos almacenados en los buffers. En otras palabras, expresa la disposición, los offsets y los tamaños de los atributos almacenados dentro de un buffer que posteriormente serán procesados por la GPU.&lt;/p&gt;

&lt;p&gt;VBO son las siglas de &lt;em&gt;Vertex Buffer Object&lt;/em&gt;. Un VBO es un recurso utilizado para almacenar los datos crudos de los vértices de una malla en memoria gestionada por OpenGL.&lt;/p&gt;

&lt;p&gt;Por este motivo, la representación de una malla en OpenGL requiere tanto los datos almacenados en memoria como la descripción de cómo dichos datos deben interpretarse para ser procesados por la GPU.&lt;/p&gt;

&lt;p&gt;Haciendo una analogía con C/C++, un VBO puede compararse conceptualmente con una reserva de memoria dinámica. Del mismo modo que &lt;code&gt;malloc()&lt;/code&gt; permite reservar memoria para almacenar datos, un VBO permite almacenar información que posteriormente será consumida por la GPU.&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="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Siguiendo esta línea, un VAO cumple un rol similar a la información que el compilador obtiene a partir de una estructura (&lt;code&gt;struct&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;En el caso de una figura 3D, cada vértice puede componerse de tres valores flotantes, uno por cada eje:&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="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Vertex&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dado que un &lt;code&gt;float&lt;/code&gt; ocupa 4 bytes, una instancia de &lt;code&gt;Vertex&lt;/code&gt; ocupa 12 bytes en memoria.&lt;/p&gt;

&lt;p&gt;Esta información debe configurarse mediante los atributos almacenados en el VAO para que OpenGL sepa que cada vértice ocupa 12 bytes y pueda recorrer el buffer agrupando correctamente los datos. De esta forma existe coherencia entre la disposición real de los datos en memoria y la forma en que la GPU los interpreta durante el renderizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fuentes y referencias&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de Vries, J. LearnOpenGL. &lt;a href="https://learnopengl.com/" rel="noopener noreferrer"&gt;https://learnopengl.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gordon, V. S., &amp;amp; Clevenger, J. Computer Graphics Programming in OpenGL with C++.
&lt;a href="https://athena.ecs.csus.edu/%7Egordonvs/textC2E.html" rel="noopener noreferrer"&gt;https://athena.ecs.csus.edu/~gordonvs/textC2E.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Atribución de imagen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagen de portada obtenida de LearnOpenGL:&lt;br&gt;
&lt;a href="https://learnopengl.com/Getting-started/Hello-Triangle" rel="noopener noreferrer"&gt;https://learnopengl.com/Getting-started/Hello-Triangle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opengl</category>
      <category>cpp</category>
      <category>spanish</category>
      <category>español</category>
    </item>
  </channel>
</rss>
