Opengl es 从.obj获取索引

Opengl es 从.obj获取索引,opengl-es,Opengl Es,我不知道OpenGLES。但我必须在我的android应用程序中使用.obj 3d模型的功能。 在.obj文件中,我可以找到顶点、纹理坐标和法线。但是没有指数,而是有脸元素。 有人能清楚地解释一下如何从.obj文件中获取索引吗?可能有点难写清楚,因为obj认为的顶点不是OpenGL认为的顶点。让我们看看 OBJ文件建立OBJ顶点(v)、纹理坐标(vt)、法线(n)的列表。你可能永远都不想把这些东西交给OpenGL(但是为了警告,请跳到最后)。它们只是加载代码以确定v1、vt3等含义的一种方式 o

我不知道OpenGLES。但我必须在我的android应用程序中使用.obj 3d模型的功能。 在.obj文件中,我可以找到顶点、纹理坐标和法线。但是没有指数,而是有脸元素。
有人能清楚地解释一下如何从.obj文件中获取索引吗?

可能有点难写清楚,因为obj认为的顶点不是OpenGL认为的顶点。让我们看看

OBJ文件建立OBJ顶点(
v
)、纹理坐标(
vt
)、法线(
n
)的列表。你可能永远都不想把这些东西交给OpenGL(但是为了警告,请跳到最后)。它们只是加载代码以确定
v1
vt3
等含义的一种方式

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

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

  • 实例化一个从
    v/vt/vn
    三元组到opengl顶点索引的空散列映射,一个空opengl顶点列表,以及一个空索引列表,以便以后应用到
    GLDraweElements
  • 对于OBJ文件中的每个三元组:
    • 查看散列图以确定它是否已经在opengl顶点列表中,如果已经在,则获取索引并将其添加到元素列表中
    • 如果没有,则将下一个可用索引分配给三元组(因此,这只是一个递增的数字),将其放入哈希映射和元素列表中,合并三元组并将其插入opengl顶点列表中
您可以尝试在绘图时尽量减少对opengl顶点列表的潜在高度随机访问,从而做得更好,但不要过早地进行优化


警告:


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

可能有点难以清楚地写出来,因为OBJ认为顶点的内容与OpenGL认为顶点的内容不同。让我们看看

OBJ文件建立OBJ顶点(
v
)、纹理坐标(
vt
)、法线(
n
)的列表。你可能永远都不想把这些东西交给OpenGL(但是为了警告,请跳到最后)。它们只是加载代码以确定
v1
vt3
等含义的一种方式

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

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

  • 实例化一个从
    v/vt/vn
    三元组到opengl顶点索引的空散列映射,一个空opengl顶点列表,以及一个空索引列表,以便以后应用到
    GLDraweElements
  • 对于OBJ文件中的每个三元组:
    • 查看散列图以确定它是否已经在opengl顶点列表中,如果已经在,则获取索引并将其添加到元素列表中
    • 如果没有,则将下一个可用索引分配给三元组(因此,这只是一个递增的数字),将其放入哈希映射和元素列表中,合并三元组并将其插入opengl顶点列表中
您可以尝试在绘图时尽量减少对opengl顶点列表的潜在高度随机访问,从而做得更好,但不要过早地进行优化


警告:


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

您需要阅读波前对象文件规范您的意思是:是的,类似于这样的东西,甚至从维基百科上也可以。因为我知道如何从面获取索引,所以面将仅使用索引来形成。我只是理解“每个面可以包含三个或更多元素。f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3…”但是没有从面元素获取索引的方法。我认为你不需要特殊的方法来获取索引。。!!!。只需使用分隔符拆分字符串并获取索引值。。!!你需要阅读波阵面对象文件规格你的意思是:是的,类似的,甚至是维基百科上的。因为我知道如何从面获取索引,所以面将仅使用索引来形成。我只是理解“每个面可以包含三个或更多元素。f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3…”但是没有从面元素获取索引的方法。我认为你不需要特殊的方法来获取索引。。!!!。只需使用分隔符拆分字符串并获取索引值。。!!