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 顶点与骨骼信息交错的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 绘制列表转换为顶点数组或 VBO

opengl vbo 纹理

OpenGL - 如何理解 VAO 与 VBO 之间的关系

OpenGL,交错的 VBO(顶点、法线和颜色)与光

OpenGL顶点数组对象不记录VBO和IBO绑定

初识OpenGL VBO顶点缓冲对象