1

我正在使用 C++ 和 OpenGL 导入 3d 模型(使用 FBX SDK)。

我做了一个顶点类型:

struct Vertex {
    Vec3 position;
    Vec2 texCoord;
    Vec3 normal;
    Vec3 binormal;
    Vec3 tangent;
    SkinInfo skin;
}

目前,我std::numeric_limits<float>::infinity()在加载模型时将 a 分配给未使用的组件。并用 构造一个网格类std::vector<Vertex>

网格类的 ctor 将顶点列表更改为交错数组并计算偏移量和步幅,省略未使用的组件。

问题是,在加载模型时。对于简单的物体,只有位置、UV和法线信息;多么浪费内存。

也许最好的解决方案是将 fbx 文件导出为游戏友好格式,但我没有足够的时间。

我必须使用索引顶点数组来实现性能(glDrawElements),但如果不使用顶点类型进行重复数据删除和索引,我找不到更好的解决方案。有更好的主意吗?

4

1 回答 1

1

大多数性能渲染应用程序都有一组(小)它们使用的顶点格式。对于您的属性,我看到了三种可能的顶点格式:未蒙皮/未凹凸贴图、未蒙皮与凹凸贴图和蒙皮(使用凹凸贴图)。也可能存在无凹凸映射格式的蒙皮格式,但这取决于您和您的数据。

所以你应该有 3 种不同的格式(如果你想通过 C++ 数据结构来定义它们,你可以使用 3 种不同的结构)。您应该在不更改顶点格式的情况下尽可能多地进行渲染,因此您应该根据格式对模型进行分组。也就是说,如果您的大部分地形都未蒙皮,则使用未蒙皮格式一次渲染所有地形。

简而言之,没有什么会强迫您使用单一顶点格式。因此,如果这不适合您的需求,请不要将自己局限于这种格式。

于 2018-11-12T15:39:33.243 回答