Essa terminologia está enraizada na história do OpenGL. O que é importante lembrar é que, para a maioria das versões GL relevantes aqui, o OpenGL foi desenvolvido de forma incremental e adicionando novas funcionalidades a uma API já existente, em vez de alterá-la.
A primeira versão do OpenGL não possuía nenhum desses tipos de objetos. O desenho foi conseguido através da emissão de várias chamadas glBegin / glEnd, e um problema com esse modelo era que ele era muito ineficiente em termos de sobrecarga de chamada de função.
O OpenGL 1.1 deu os primeiros passos para resolver isso, introduzindo matrizes de vértices. Em vez de especificar diretamente os dados dos vértices, você agora pode obtê-los de matrizes C / C ++ - daí o nome. Portanto, uma matriz de vértices é exatamente isso - uma matriz de vértices e o estado GL necessário para especificá-los.
A próxima grande evolução veio com o GL 1.5 e permitiu armazenar dados da matriz de vértices na memória da GPU, em vez da memória do sistema ("lado do cliente"). Um ponto fraco da especificação da matriz de vértices GL 1.1 era que o conjunto completo de dados de vértices precisava ser transferido para a GPU toda vez que você queria usá-los; se já estivesse na GPU, essa transferência poderia ser evitada e possíveis ganhos de desempenho.
Portanto, um novo tipo de objeto GL foi criado para permitir o armazenamento desses dados na GPU. Assim como um objeto de textura é usado para armazenar dados de textura, um objeto de buffer de vértice armazena dados de vértice. Este é realmente apenas um caso especial de um tipo de objeto de buffer mais geral que pode armazenar dados não específicos.
A API para usar objetos de buffer de vértice era suportada por piggy na API de matrizes de vértice já existente, e é por isso que você vê coisas estranhas como converter deslocamentos de bytes em ponteiros nela. Portanto, agora temos uma API de matrizes de vértices que apenas armazena estado, com os dados sendo originados de objetos de buffer em vez de matrizes na memória.
Isso nos leva quase ao fim de nossa história. A API resultante era bastante detalhada quando se tratava de especificar o estado da matriz de vértices; portanto, outro caminho de otimização era criar um novo tipo de objeto que coletasse todo esse estado, permitisse várias alterações de estado da matriz de vértices em uma única chamada de API e permitisse GPUs potencialmente realizar otimizações devido à capacidade de saber qual estado seria usado com antecedência.
Digite o objeto da matriz de vértices, que coleta tudo isso junto.
Então, para resumir, uma matriz de vértices começou a vida como uma coleção de estado e dados (armazenados em uma matriz) para serem desenhados. Um buffer de vértice substitui o armazenamento da matriz na memória por um tipo de objeto GL, deixando a matriz de vértice apenas no estado. Um objeto de matriz de vértice é apenas um objeto de contêiner para esse estado, permitindo que ele seja alterado mais facilmente e com menos chamadas de API.
char* buffer = socketRead();
(pseudocódigo). O log, por outro lado, dura todo o ciclo de vida do aplicativo. Então, você cria uma matriz em algum lugar e começa a ler o soquete, sempre que obtém dados que gravam essa parte na matriz, fornecendo uma lista clara de todos os dados recebidos.