我不知道opengl-es。但我必须在我的Android应用程序中使用.obj 3d模型的功能。 在.obj文件中,我可以找到Vertices,Texcoords和Normals。但没有指数,而是有面子元素。 任何人都可以清楚地解释如何从.obj文件中获取索引吗?
答案 0 :(得分:2)
可能有点难以写清楚,因为OBJ认为顶点不是OpenGL认为的顶点。我们来看看......
OBJ文件建立了obj-vertices(v
),纹理坐标(vt
),法线(n
)的列表。您可能不希望将这些内容交给OpenGL(但是为了警告而跳到最后)。它们只是您加载代码以确定v1
,vt3
等含义的一种方式。
指定openGL-vertices的唯一位置是f
语句。例如。 v1/vt1/vn1
表示“具有位置,纹理坐标和法线的OpenGL顶点,在列表中指定”。
因此,加载的可行解决方案是伪代码:
v/vt/vn
三元组到opengl-vertex索引的空哈希映射,一个空的opengl-vertex列表,以及一个空的索引列表,以便以后提供给glDrawElements
; 您可以尝试在绘图时尽量减少它对opengl-vertex列表所暗示的潜在高度随机访问,但不要过早优化。
警告:
如果您的GPU支持顶点纹理提取(即顶点着色器中的纹理采样),那么您可以直接向OpenGL提供三元组,将obj-vertices等累积到纹理贴图中,并在您的内容中进行间接查找顶点着色器。使用顶点纹理提取,纹理实际上只是随机访问2d数组。但是,许多Android GPU不支持顶点纹理提取(即使它们支持表面上需要的ES 3,因为它允许实现指定它支持最多零采样器)。