我想将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.我的方法听起来不错还是疯狂?如果发疯了,请指出我要去哪里。
最佳答案
你是说除了哈希冲突?因为我看不到您的算法中处理该问题的部分。
有一个简单得多的方法:只比较索引而不使用哈希。