C++ 和 OpenGL,VBO 顶点与骨骼信息交错
Posted
技术标签:
【中文标题】C++ 和 OpenGL,VBO 顶点与骨骼信息交错【英文标题】:C++ and OpenGL, VBO vertex interleaving with bone information 【发布时间】:2014-07-29 22:42:41 【问题描述】:我有一个关于 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 的内容进行监视,每个元素都是乱码,例如 '\0',因为它们已经被强制转换为 BYTE。将这个 BYTE 向量传递给 glBufferData 可以吗? OpenGL 可以翻译吗?
我的第二个问题与我传入的数据的交错有关,以及 OpenGL 如何处理这些数据以使用 glDrawElementsBaseVertex 进行绘图。如果我想交错我的顶点信息(顶点、UV、法线),我是否还需要交错骨骼信息,或者我可以为骨骼信息设置第二个 VBO?
【问题讨论】:
glBufferData
不在乎您的指针是什么“类型”,只要它指向具有size
长度的有效内存。
【参考方案1】:
回答您的第一个问题:是的,OpenGL 可以将您的缓冲区数据转换回合理的类型。当您致电(例如)glVertexAttribPointer
时,您会向它提供此信息。
回答您的第二个问题:是的,您可以交错一些顶点信息并将骨骼权重/索引存储在另一个 VBO 中。在调用 glVertexAttribPointer
获取骨骼属性之前,您只需绑定第二个缓冲区。
交错所有顶点属性通常被认为是最佳实践,但可能有理由不这样做(可能某些属性在不同的网格之间共享,而其他属性是唯一的),并且性能可能不会有明显差异。
【讨论】:
太好了,我有一种感觉,但在我知道我的设计可行之前,我不想继续前进。这真的很有帮助,谢谢!以上是关于C++ 和 OpenGL,VBO 顶点与骨骼信息交错的主要内容,如果未能解决你的问题,请参考以下文章