我有一个关于OpenGL如何处理缓冲区数据的问题,特别是对于动画网格。
我正在编写一个VBO类,我有这个功能:
void VertexBufferObject::AddData(void* p_ptr_data, UINT p_dataSize)
{
g_data = *static_cast<std::vector<BYTE>*>(p_ptr_data);
g_dataSize = p_dataSize;
}
...我将aiVector3D或aiVector2D的向量传递给我,这取决于我是否通过了顶点或纹理坐标。目前我正在为每个顶点,纹理,法线,骨骼和索引使用一个VBO(稍后会详细介绍)。无论如何,VBO有一个BYTE的全局向量,它被上传到GPU:
void VertexBufferObject::UploadDataToGPU(int p_drawingHint)
{
glBufferData(g_bufferType, g_data.size() * g_dataSize , &g_data[0], p_drawingHint);
g_dataUploaded = true;
g_data.clear();
}
现在,我的第一个问题是:我将BYTE的向量传递给glBufferData,显然如果我对g_data的内容进行监视,每个元素都是乱码,例如&#39; \ 0&# 39;因为他们已被投入BYTE。将这个BYTE向量传递给glBufferData是没关系的吗? OpenGL可以翻译吗?
我的第二个问题涉及到传入的数据的交错以及OpenGL如何处理用于使用glDrawElementsBaseVertex进行绘制的数据。如果我想交错我的顶点信息(顶点,UV,法线),我是否还需要将骨信息与之交错,或者我可以为骨信息设置第二个VBO吗?
答案 0 :(得分:0)
回答第一个问题:是的,OpenGL可以将缓冲区数据转换回合理的类型。您在致电(例如)glVertexAttribPointer
时提供此信息。
回答第二个问题:是的,您可以交错一些顶点信息并将骨骼权重/指数存储在另一个VBO中。在为骨骼属性调用glVertexAttribPointer
之前,您只需绑定第二个缓冲区。
通常认为最佳实践是交错所有顶点属性,但可能有理由不这样做(可能某些属性在不同网格之间共享,而其他属性是唯一的),并且性能可能没有明显差异。