Assimp、BGFX 和 C++ 无法将顶点与索引匹配

Assimp, BGFX and C++ trouble matching vertices to indices

提问人:will martin 提问时间:7/18/2023 更新时间:7/19/2023 访问量:67

问:

我一直在尝试在 c++ 中创建一个通用模型类,该类可以使用任何基础数据类型,由其 BGFX 布局定义。为此,我一直在使用 assimp 导入模型数据。不幸的是,我发现索引和顶点似乎不匹配,我已经将问题追溯到处理索引和顶点的函数。即使我只导入仓位并且它们之间没有偏移量,这个问题仍然存在,因此我不确定导入时哪里出了问题。我导入数据以复制数据的网格类基于指向源的 void* 指针、要复制到网格缓冲区中的偏移量(以字节为单位)以及要复制的数据大小(以字节为单位)。

有问题的功能:

void ProcessVerticesAndIndices(const aiMesh* mesh, SGModel::Mesh& meshtmp)
{
using namespace bgfx;
using namespace SGModel;

//Preallocate memory
meshtmp.reserveVerticesData(mesh->mNumVertices * meshtmp.layout().getSize(1));
meshtmp.reserveIndicesData(mesh->mNumFaces * TRIANGULATED_VERTEX_COUNT * sizeof(Indice));

size_t vertex_size = meshtmp.layout().getSize(1);
for (size_t i = 0; i < mesh->mNumVertices; ++i)
{
    //Process vertices
    if (mesh->HasPositions())
    {
        //Type sizes are the size of the primitive type of the attribute (e.g. sizeof(float), sizeof(int32_t) etc)
        uint8_t pos_type_size = GetBGFXAttributeTypeSize(GetBGFXAttributeType(Attrib::Position));
        meshtmp.copyVertices(&mesh->mVertices[i].x, i * vertex_size, pos_type_size);
        meshtmp.copyVertices(&mesh->mVertices[i].y, i * vertex_size + pos_type_size, pos_type_size);
        meshtmp.copyVertices(&mesh->mVertices[i].z, i * vertex_size + 2 * pos_type_size, pos_type_size);
    }
}

size_t indices_index = 0;
for(size_t i = 0; i < mesh->mNumFaces; ++i)
{
    auto face = mesh->mFaces[i];
    for (size_t j = 0; j < face.mNumIndices; ++j)
    {
        meshtmp.copyIndices(&face.mIndices[j], indices_index * sizeof(Indice), sizeof(Indice));
        indices_index++;
    }
}

}

多维数据集顶点和索引的控制台打印:

VERTICES (in buffer order):
 Index: 0
 POS: 4 4 4
 Index: 1
 POS: -4 4 4
 Index: 2
 POS: -4 -4 4
 Index: 3
 POS: 4 -4 4
 Index: 4
 POS: 4 -4 -4
 Index: 5
 POS: 4 -4 4
 Index: 6
 POS: -4 -4 4
 Index: 7
 POS: -4 -4 -4
 Index: 8
 POS: -4 -4 -4
 Index: 9
 POS: -4 -4 4
 Index: 10
 POS: -4 4 4
 Index: 11
 POS: -4 4 -4
 Index: 12
 POS: -4 4 -4
 Index: 13
 POS: 4 4 -4
 Index: 14
 POS: 4 -4 -4
 Index: 15
 POS: -4 -4 -4
 Index: 16
 POS: 4 4 -4
 Index: 17
 POS: 4 4 4
 Index: 18
 POS: 4 -4 4
 Index: 19
 POS: 4 -4 -4
 Index: 20
 POS: -4 4 -4
 Index: 21
 POS: -4 4 4
 Index: 22
 POS: 4 4 4
 Index: 23
 POS: 4 4 -4
 INDICES (in buffer order):
 0
 1
 2
 0
 2
 3
 4
 5
 6
 4
 6
 7
 8
 9
 10
 8
 10
 11
 12
 13
 14
 12
 14
 15
 16
 17
 18
 16
 18
 19
 20
 21
 22
 20
 22
 23

渲染输出(应为黑色立方体):The render output (should be a black cube)

C++ ASSIMP BGFX

评论


答:

0赞 KimKulling 7/19/2023 #1

对我来说,这个输出和代码看起来是正确的。到目前为止,您正在以正确的方式存储所有索引。

对我来说,您的渲染代码似乎有问题。您是否配置了正确的索引类型或顶点类型?因此,这方面的更多投入将非常有用。