具有不同索引的Obj文件加载器

时间:2014-12-01 15:30:02

标签: c++ opengl

读取我的obj文件,并且只考虑顶点及其索引,我的对象就顶点而言呈现所需的对象;现在我只使用一个基本的颜色数组,这样我就可以确定我的装载机是否有效。我意识到OpenGL之前没有正确地绘制我的对象,因为uv索引是用顶点索引读取的 - 我读了一行中的所有索引说:

f 2/3/4 3/6/1 1/3/6

进入一个向量,然后传递给GL_ELEMENT_ARRAY_BUFFER。不幸的是,OpenGL(也不是DirectX)允许多个索引缓冲区。所以,这意味着我不能有一个单独的向量,它只保存uv索引,另一个保持顶点索引;或另一个持有正常指数。只有一个索引缓冲区,因此只有一个向量保存顶点,纹理和法线的索引;如何指示OpenGL绘制obj文件中规定的原语而不省略一个索引而支持另一个索引?

注意:我使用glDrawElements(..)绘制基元;我过去使用过glDrawArrays(..),但这次我想用前一种方法来提高效率。

2 个答案:

答案 0 :(得分:2)

如果他们允许使用多个索引缓冲区,它只会给你一个不错的性能枪,可以用脚射击自己。

但是,您可以做的是将模型数据解压缩到具有[Position,Normal,Texccord]结构的(即交错的)VBO中,并使用适当的数据手动填充它。这将消耗更多内存,但允许您简单地将其呈现为无索引。

"效率"如果三胞胎有共同的重复,那么你只会说。如果他们确实这样做了,那么由您来找到它们,相应地对唯一的三元组进行编号并为它们创建索引缓冲区。

玩得开心:)

答案 1 :(得分:1)

而不是创建具有保持顶点位置和uvs

的单独顶点数组
verts = [vec3f, vec3f, ...]
norms = [vec3f, vec3f, ...]
uvs = [vec2f, vec2f, ...]

您应该创建一个单独的数组,根据所有三个属性

定义每个顶点
verts = [(vec3f, vec3f, vec2f), (vec3f, vec3f, vec2f), ...]

然后每个索引将对应一个顶点。这意味着您必须将OBJ文件中的一些信息复制到顶点数组中,因为每个顶点对应于OBJ文件中的唯一三元组。您可以在stride的{​​{1}}和position参数中使用不同的尺寸指定属性