OpenGL 2.1使用不同的缓冲区索引绘制对象

时间:2012-06-06 12:30:22

标签: c api opengl

我正在使用OpenGL 2.1处理OBJ文件。这是OBJ规范:http://www.martinreddy.net/gfx/3d/OBJ.spec 据此,一个面被表示为顶点/纹理/法线,其中顶点,纹理和法线不同,每个缓冲区中顶点,纹理坐标和法线索引的平均索引是不同的。

问题:如何绘制一个为每个顶点,纹理和普通数组提供不同指示缓冲区的对象?

1 个答案:

答案 0 :(得分:4)

可悲的回答,这在OpenGL中是不可能的。在OpenGL(以及许多其他此类系统,尤其是Direct3D)中,顶点在概念上是所有顶点属性的并集,如位置,法线或纹理坐标(很遗憾,术语 vertex 通常仅用于对于位置属性)。因此,具有相同位置但不同法向量的两个顶点在概念上是两个不同的顶点。

这就是为什么你必须为所有属性使用相同的顶点索引的原因。因此,要使用OpenGL或类似的库绘制.OBJ文件,您将无法在加载后处理数据。

最简单的方法是完全删除索引,并使用从面部规范中读取的索引,一个接一个地存储每个三角形角的所有顶点数据,因此具有3*F个顶点而没有索引。然而,这是相当低效的,因为你可能仍然有许多重复的顶点,即使从整体上考虑所有属性。

另一种选择是将索引三元组(由顶点,特殊索引和普通索引组成)插入哈希表并将其映射到组合索引。每当索引三元组已经存在时,你用哈希表中的一个索引替换它,当它不存在时,你将一个新的顶点(由position,normal和texCoords组成)添加到你最终渲染的顶点数组,索引文件的使用索引三元组的顶点数组(当然,将这个新的顶点数组大小作为唯一索引插入到哈希表中)。