我想将obj模型导入到我的opengl程序中。我有一种用于将属性数据传递到着色器的类/数据格式:

class CustomVertex : public IVtxFmt
{
public:
  float m_Position[3];      // x, y, z      offset 0, size = 3*sizeof(float)
  float m_Normal[3];        // nx, ny, nz;  offset 3
  float m_TexCoords[2];     // u, v         offset 6
  float m_Colour[4];        // r, g, b, a   offset 8
  float m_Tangent[3];       // r, g, b      offset 12
  float m_Bitangent[3];     // r, g, b      offset 15
};

因此,我正在使用从Internet下载的小木屋模型。

小木屋具有多个顶点,法线和纹理坐标定义,后跟一系列面定义。

所以我的第一个直觉是解析obj文件并最终得到
vector<vertex>
vector<Normal>
vector<TexCoord>

转换为我的CustomVertex格式并不容易,因为在文件中定义了210个顶点,100个tex坐标和80个法线。

在以这种格式列出〜390张面孔之后:
f 83/42/1 67/46/1 210/42/1

我在文件中遇到以下内容:
#
# object tile00
#

其次是更多的顶点定义。

因此,我由此推断出一个模型可能由几个子对象组成,每个子对象都由许多面定义。每个面由3 x顶点/法线/ texcoord索引值定义。

因此,为了获得CustomVertex的 vector ,我在想我需要执行以下操作:

创建并填充:
vector <vertex>
vector <normal>
vector <texcoord>

vector <indices>

我需要为面部定义中的每个唯一的v / vn / vt三元组创建一个CustomVertex。

所以我想到了创建 map :
std::vector<CustomVertex> and
std::map< nHashId, CustomVertex_index >

所以我的想法是,对于遇到的每个v / vn / vt,我都会为此字符串创建一个哈希,例如nHashId = hash(“80/50/1”)*并在 map 上搜索哈希。如果不存在,则创建一个CustomVertex并将其添加到 vector 中,然后将新创建的哈希值和CustomVertex_index添加到 map 中。

*:通过创建v / vn / vt字符串的哈希,我创建了一个与该字符串相对应的唯一数值,我希望在 map 中搜索/比较该字符串的速度要比等效文本更快。

如果遇到哈希的匹配项,则认为customvertex已经存在,而不是创建新的CustomVertex,而是将CustomVertex_index条目添加到索引 vector 并继续。

由于这似乎是一个计算量很大的练习,我想我将把CustomVertex数组(和相应的索引数组)转储到磁盘上供以后检索,而不是每次都解析obj文件。

在问我问题之前,我想指出一下,由于时间限制并且不想重新设计Vbo类(一项艰巨的任务),我坚持使用CustomVertex格式-我知道可以在其中提供属性将单独的数组分配给我的着色器,但是我读过像使用CustomVertex那样对数据进行交织可以提高性能。

所以对我的问题:
1.我的方法听起来不错还是疯狂?如果发疯了,请指出我要去哪里。
  • 您能发现任何潜在的问题吗?
  • 以前有人做过吗,可以推荐一种更简单的方法来实现我的目标吗?
  • 最佳答案



    你是说除了哈希冲突?因为我看不到您的算法中处理该问题的部分。



    有一个简单得多的方法:只比较索引而不使用哈希。

    10-08 15:09