Opengl es 从.obj获取索引
我不知道OpenGLES。但我必须在我的android应用程序中使用.obj 3d模型的功能。 在.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
有人能清楚地解释一下如何从.obj文件中获取索引吗?可能有点难写清楚,因为obj认为的顶点不是OpenGL认为的顶点。让我们看看 OBJ文件建立OBJ顶点(
v
)、纹理坐标(vt
)、法线(n
)的列表。你可能永远都不想把这些东西交给OpenGL(但是为了警告,请跳到最后)。它们只是加载代码以确定v1
、vt3
等含义的一种方式
openGL顶点的唯一指定位置是在f
语句中。例如,v1/vt1/vn1
表示“列表后面指定的具有位置、纹理坐标和法线的OpenGL顶点”
因此,一个可行的加载解决方案是,在伪代码中:
- 实例化一个从
三元组到opengl顶点索引的空散列映射,一个空opengl顶点列表,以及一个空索引列表,以便以后应用到v/vt/vn
李>GLDraweElements
- 对于OBJ文件中的每个三元组:
- 查看散列图以确定它是否已经在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顶点”
因此,一个可行的加载解决方案是,在伪代码中:
- 实例化一个从
三元组到opengl顶点索引的空散列映射,一个空opengl顶点列表,以及一个空索引列表,以便以后应用到v/vt/vn
李>GLDraweElements
- 对于OBJ文件中的每个三元组:
- 查看散列图以确定它是否已经在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…”但是没有从面元素获取索引的方法。我认为你不需要特殊的方法来获取索引。。!!!。只需使用分隔符拆分字符串并获取索引值。。!!