从.obj获取指数

时间:2016-04-06 09:30:49

标签: opengl-es

我不知道opengl-es。但我必须在我的Android应用程序中使用.obj 3d模型的功能。 在.obj文件中,我可以找到Vertices,Texcoords和Normals。但没有指数,而是有面子元素。 任何人都可以清楚地解释如何从.obj文件中获取索引吗?

1 个答案:

答案 0 :(得分:2)

可能有点难以写清楚,因为OBJ认为顶点不是OpenGL认为的顶点。我们来看看......

OBJ文件建立了obj-vertices(v),纹理坐标(vt),法线(n)的列表。您可能不希望将这些内容交给OpenGL(但是为了警告而跳到最后)。它们只是您加载代码以确定v1vt3等含义的一种方式。

指定openGL-vertices的唯一位置是f语句。例如。 v1/vt1/vn1表示“具有位置,纹理坐标和法线的OpenGL顶点,在列表中指定”。

因此,加载的可行解决方案是伪代码:

  • 实例化从v/vt/vn三元组到opengl-vertex索引的空哈希映射,一个空的opengl-vertex列表,以及一个空的索引列表,以便以后提供给glDrawElements;
  • 对于OBJ文件中的每个三元组:
    • 查看哈希映射以确定它是否已经在opengl-vertex列表中,如果是,则获取索引并将其添加到元素列表中;
    • 如果没有,则将下一个可用索引分配给三元组(因此,这只是一个递增的数字),将其放入哈希映射和元素列表中,组合三元组并将其插入到opengl-vertex列表中。 / LI>

您可以尝试在绘图时尽量减少它对opengl-vertex列表所暗示的潜在高度随机访问,但不要过早优化。

警告:

如果您的GPU支持顶点纹理提取(即顶点着色器中的纹理采样),那么您可以直接向OpenGL提供三元组,将obj-vertices等累积到纹理贴图中,并在您的内容中进行间接查找顶点着色器。使用顶点纹理提取,纹理实际上只是随机访问2d数组。但是,许多Android GPU不支持顶点纹理提取(即使它们支持表面上需要的ES 3,因为它允许实现指定它支持最多零采样器)。