我试图在顶点数组对象(VAO)中使用两个顶点缓冲区对象(VBO)和两个索引缓冲区对象(IBO)来渲染包含3D模型的wavefront .Obj文件中的数据。 .obj文件使用vertex/normal face definition:
f v1//vn1 v2//vn2 v3//vn3
我意识到我不能使用两个IBO来使用OpenGL的VAO进行索引,因为只有一个缓冲区对象(一次)可以绑定到GL_ELEMENT_ARRAY_BUFFER绑定目标。这意味着我不能只定义顶点位置索引和顶点法线索引,当我需要两者作为GLSL顶点着色器的输入时,这是一个问题。
我想过使用封装顶点位置和顶点法线的“顶点”结构,但是我不知道如何将数据作为除了一个长数组之外的任何数据提供给OpenGL,并且当我将所有顶点位置数据放在不同的对象中时。我想我可以使用一些循环将数据复制到包含所有位置数据的新数组。
当加载.obj文件时,我想我可以处理数据,以便法线与相应的顶点位置值匹配。
我该如何解决这个问题呢?
我正在使用C ++和Visual Studio 2012和OpenGL 3.3。
答案 0 :(得分:7)
您必须了解的一点是,“顶点”与“位置”不是同义词。顶点是整个属性集;位置,法线,纹理坐标等.OpenGL一次处理几何一个基元,其中基元由1(点),2(线)或3个顶点(三角形)组成。你不能单独处理位置和正常,他们总是必须一起处理。
在OpenGL中处理它之前,必须扩展.obj文件中的数据。对于每个唯一的属性元组,引入一个带有新索引的新顶点,并用.obj替换索引顶点OpenGL所需的索引属性。