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