读取我的obj文件,并且只考虑顶点及其索引,我的对象就顶点而言呈现所需的对象;现在我只使用一个基本的颜色数组,这样我就可以确定我的装载机是否有效。我意识到OpenGL之前没有正确地绘制我的对象,因为uv索引是用顶点索引读取的 - 我读了一行中的所有索引说:
f 2/3/4 3/6/1 1/3/6
进入一个向量,然后传递给GL_ELEMENT_ARRAY_BUFFER。不幸的是,OpenGL(也不是DirectX)允许多个索引缓冲区。所以,这意味着我不能有一个单独的向量,它只保存uv索引,另一个保持顶点索引;或另一个持有正常指数。只有一个索引缓冲区,因此只有一个向量保存顶点,纹理和法线的索引;如何指示OpenGL绘制obj文件中规定的原语而不省略一个索引而支持另一个索引?
注意:我使用glDrawElements(..)绘制基元;我过去使用过glDrawArrays(..),但这次我想用前一种方法来提高效率。
答案 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
参数中使用不同的尺寸指定属性