提问人:will martin 提问时间:7/18/2023 更新时间:7/19/2023 访问量:67
Assimp、BGFX 和 C++ 无法将顶点与索引匹配
Assimp, BGFX and C++ trouble matching vertices to indices
问:
我一直在尝试在 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
答:
0赞
KimKulling
7/19/2023
#1
对我来说,这个输出和代码看起来是正确的。到目前为止,您正在以正确的方式存储所有索引。
对我来说,您的渲染代码似乎有问题。您是否配置了正确的索引类型或顶点类型?因此,这方面的更多投入将非常有用。
评论