我正在使用 OpenGL 2.1 处理 OBJ 文件。这是 OBJ 规范: http: //www.martinreddy.net/gfx/3d/OBJ.spec 据此,面表示为顶点/纹理/法线,其中顶点,纹理和法线不同,这是顶点的平均索引,每个缓冲区中的纹理坐标和法线索引是不同的。
问题:如何绘制为每个顶点、纹理和法线数组提供不同指示缓冲区的对象?
我正在使用 OpenGL 2.1 处理 OBJ 文件。这是 OBJ 规范: http: //www.martinreddy.net/gfx/3d/OBJ.spec 据此,面表示为顶点/纹理/法线,其中顶点,纹理和法线不同,这是顶点的平均索引,每个缓冲区中的纹理坐标和法线索引是不同的。
问题:如何绘制为每个顶点、纹理和法线数组提供不同指示缓冲区的对象?
可悲的答案,这在 OpenGL 中是不可能的。在 OpenGL(以及许多其他此类系统,尤其是 Direct3D)中,顶点在概念上是所有顶点属性的联合,例如位置、法线或纹理坐标(不幸的是,术语顶点通常仅用于位置属性)。因此,具有相同位置但不同法线向量的两个顶点在概念上是两个不同的顶点。
这就是为什么您必须对所有属性使用相同的顶点索引的原因。因此,要使用 OpenGL 或类似库绘制 .OBJ 文件,您无需在加载后处理数据。
最简单的方法是完全删除索引,并使用从面规范中读取的索引一个接一个地存储每个三角形角的所有顶点数据,因此有3*F
顶点而没有索引。然而,这是相当低效的,因为您可能仍然有许多重复的顶点,即使从整体上考虑所有属性。
另一种选择是将索引三元组(由顶点、texcoord 和普通索引组成)插入哈希表并将其映射到组合索引。每当索引三元组已经存在时,将其替换为哈希表中的一个索引,当它不存在时,将一个新顶点(由位置、法线和 texCoords 组成)添加到最终渲染的顶点数组中,索引文件的使用索引三元组的顶点数组(当然,并将这个新的顶点数组大小作为唯一索引插入到哈希表中)。