我正在使用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
),但是如果不使用顶点类型进行重复数据删除和索引,就找不到更好的解决方案。有更好的主意吗?
答案 0 :(得分:1)
大多数性能渲染应用程序都使用一组(少量)顶点格式。对于您的属性,我看到了三种可能的顶点格式:未蒙皮/未凹凸映射,未带凹凸映射的蒙皮和已蒙皮(带有凹凸映射)。皮肤也可能没有凹凸映射格式,但这取决于您和您的数据。
因此,您应该具有3种独立的格式(如果要通过C ++数据结构定义它们,则可以使用3种独立的结构)。您应该在不更改顶点格式的情况下尽可能合理地渲染,因此您应该基于格式对模型进行分组。也就是说,如果您的大多数地形都没有皮肤,请使用无皮肤格式一次渲染所有地形。
简而言之,没有什么强迫可以使用单个顶点格式。因此,如果这不适合您的需求,请不要只限于那种格式。