【问题标题】:Obj file loader with different indices具有不同索引的 Obj 文件加载器
【发布时间】:2015-01-29 15:40:01
【问题描述】:

读取我的 obj 文件,并且仅考虑顶点及其索引,我的对象就顶点而言呈现所需的对象;现在我只使用一个基本的颜色数组,所以我可以确定我的加载器工作正常。我意识到 OpenGL 之前没有正确绘制我的对象,因为 uv 索引是用顶点索引读取的——我从一行中读取了所有索引:

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

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

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

【问题讨论】:

标签: c++ opengl


【解决方案1】:

如果他们允许多个索引缓冲区,它只会给你一个很好的性能枪来射击自己的脚。

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

您所说的“效率”只有在 三元组 有共同的重复项时才会发生。如果他们确实这样做了,则由您来找到它们,相应地为唯一的三元组编号并为它们创建一个索引缓冲区。

玩得开心:)

【讨论】:

    【解决方案2】:

    而不是创建单独的顶点数组来保存顶点位置和 uvs

    verts = [vec3f, vec3f, ...]
    norms = [vec3f, vec3f, ...]
    uvs = [vec2f, vec2f, ...]
    

    您应该创建一个数组,根据所有三个属性定义每个顶点

    verts = [(vec3f, vec3f, vec2f), (vec3f, vec3f, vec2f), ...]
    

    然后每个索引将对应一个顶点。这确实意味着您必须将 OBJ 文件中的一些信息复制到顶点数组中,因为每个顶点对应于 OBJ 文件中的 unique 三元组。您可以在 glVertexAttribPointerstrideposition 参数中使用不同的大小指定属性

    【讨论】:

    • 所以,我得到了三个向量:顶点、法线和纹理。您是说我应该将其中的所有数据放入一个向量中?那么我该怎么处理索引呢?它们还应该在一个向量中吗?
    • 是的,您应该总共有两个向量(或数组,或其他):一个带有顶点,一个带有索引。您必须重新生成索引以匹配来自 OBJ 文件面中唯一三元组的新构造顶点。
    • 我必须在之后传递这样的东西:glBindBuffer(GL_ARRAY_BUFFER, vertHandle); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, ?, NULL);虽然我不确定用什么作为步幅......
    • 对于glVertexAttribPointer,步幅是顶点属性之间的字节数。有关完整示例,请查看“Rendering a triangle #2”here
    猜你喜欢
    • 2017-09-28
    • 2012-08-15
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多