导入3D模型-我必须使用自定义顶点类型进行索引吗?

时间:2018-11-12 09:21:19

标签: c++ opengl graphics

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

我创建了一个顶点类型:

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

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

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

问题是,加载模型时。如果是简单物体,则只有位置,紫外线和法线信息;真是浪费内存。

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

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

1 个答案:

答案 0 :(得分:1)

大多数性能渲染应用程序都使用一组(少量)顶点格式。对于您的属性,我看到了三种可能的顶点格式:未蒙皮/未凹凸映射,未带凹凸映射的蒙皮和已蒙皮(带有凹凸映射)。皮肤也可能没有凹凸映射格式,但这取决于您和您的数据。

因此,您应该具有3种独立的格式(如果要通过C ++数据结构定义它们,则可以使用3种独立的结构)。您应该在不更改顶点格式的情况下尽可能合理地渲染,因此您应该基于格式对模型进行分组。也就是说,如果您的大多数地形都没有皮肤,请使用无皮肤格式一次渲染所有地形。

简而言之,没有什么强迫可以使用单个顶点格式。因此,如果这不适合您的需求,请不要只限于那种格式。