Esta terminología se basa en la historia de OpenGL. Lo que es importante recordar es que, para la mayoría de las versiones de GL que son relevantes aquí, OpenGL evolucionó gradualmente y al agregar nuevas funcionalidades a una API ya existente en lugar de cambiar la API.
La primera versión de OpenGL no tenía ninguno de estos tipos de objetos. El dibujo se logró mediante la emisión de múltiples llamadas glBegin / glEnd, y un problema con este modelo fue que era muy ineficiente, en términos de sobrecarga de llamadas de función.
OpenGL 1.1 dio los primeros pasos para abordar esto mediante la introducción de matrices de vértices. En lugar de especificar directamente los datos de vértice, ahora puede obtenerlos de matrices C / C ++, de ahí el nombre. Entonces, una matriz de vértices es solo eso: una matriz de vértices y el estado GL requerido para especificarlos.
La siguiente evolución importante vino con GL 1.5 y permitió almacenar datos de matriz de vértices en la memoria de la GPU en lugar de en la memoria del sistema ("lado del cliente"). Una debilidad de la especificación de matriz de vértices GL 1.1 era que el conjunto completo de datos de vértices tenía que transferirse a la GPU cada vez que deseaba usarlo; si ya estaba en la GPU, entonces esta transferencia podría evitarse y se podrían lograr ganancias potenciales de rendimiento.
Por lo tanto, se creó un nuevo tipo de objeto GL para permitir el almacenamiento de estos datos en la GPU. Al igual que un objeto de textura se usa para almacenar datos de textura, un objeto de búfer de vértice almacena datos de vértice. En realidad, esto es solo un caso especial de un tipo de objeto de almacenamiento intermedio más general que puede almacenar datos no específicos.
La API para usar objetos de búfer de vértices estaba respaldada en la API de matrices de vértices ya existente, por lo que ve cosas extrañas como convertir desplazamientos de bytes en punteros. Entonces, ahora tenemos una API de matrices de vértices que solo almacena el estado, y los datos se obtienen de objetos de búfer en lugar de matrices en memoria.
Esto nos lleva casi al final de nuestra historia. La API resultante fue bastante detallada a la hora de especificar el estado de la matriz de vértices, por lo que otra vía de optimización fue crear un nuevo tipo de objeto que reuniera todo este estado, permitiera múltiples cambios de estado de la matriz de vértices en una sola llamada de API y permitió GPU potencialmente realizar optimizaciones debido a poder saber qué estado se iba a utilizar antes de tiempo.
Ingrese el objeto de matriz de vértices, que recopila todo esto junto.
Entonces, para resumir, una matriz de vértices comenzó como una colección de estado y datos (almacenados en una matriz) para dibujar. Un búfer de vértices reemplaza el almacenamiento de la matriz en memoria con un tipo de objeto GL, dejando la matriz de vértices solo en estado. Un objeto de matriz de vértices es solo un objeto contenedor para este estado, lo que permite cambiarlo más fácilmente y con menos llamadas a la API.
char* buffer = socketRead();
(pseudocódigo). El registro, por otro lado, vive a través de todo el ciclo de vida de la aplicación. Entonces, crea una matriz en algún lugar y comienza a leer el socket, cada vez que obtiene datos, escribe esa porción en la matriz, lo que le brinda una lista ordenada de todos los datos que recibió.