2013-01-03 40 views
2

我试图在顶点阵列对象(VAO)中使用两个顶点缓冲区对象(VBO)和两个索引缓冲区对象(IBO)来渲染来自包含3D模型的波前.Obj文件的数据。使用 的obj文件是vertex/normal face definition我如何从波前.obj文件获取索引顶点位置和索引顶点法线到OpenGL顶点着色器?

f v1//vn1 v2//vn2 v3//vn3 

我发现我不能,因为只有一个缓冲对象(一次)使用两个企业家们用于索引与OpenGL的VAO可以绑定到GL_ELEMENT_ARRAY_BUFFER结合靶。这意味着我不能只定义顶点位置索引和顶点法线索引,这在我需要同时作为GLSL顶点着色器的输入时是个问题。

我想过使用封装顶点位置和顶点法线的“Vertex”结构,但我不知道如何将OpenGL数据作为任何东西提供给一个长数组,并且当我将所有顶点位置数据放在不同的对象中时。我想我可以使用一些循环将数据复制到包含所有位置数据的新数组。

加载.obj文件时,我想我可以处理数据,以便法线与相应的顶点位置值相匹配。

我应该如何解决这个问题?

我在OpenGL 3.3中使用C++和Visual Studio 2012。

回答

7

你必须明白的一件事是,“顶点”与“位置”不是同名的。顶点是整套属性;位置,法线,纹理坐标等。OpenGL每次处理一个图元,其中一个图元由1(点),2(线)或3个顶点(三角形)组成。你不能分开处理位置和正常,他们必须一起走。

在OpenGL中处理它之前,您必须展开.obj文件中的数据。对于每个属性的唯一元组引入一个带有新索引的新顶点,并用.obj替换索引顶点OpenGL所需的索引属性。

+0

谢谢你的回答,datenwolf。我现在在概念上理解它。 – aPerfectMisterMan

+0

我相信我仍然失去了一些东西。 “对于每个属性的唯一元组引入一个带有新索引的新顶点并替换索引属性...” 在一个面内,obj中的顶点具有相关的法线。在共享相同顶点的另一面中,该顶点具有不同的法线。 OpenGL中的顶点法线属性是否代表每个顶点每个顶点的法线,或者单个顶点的单个法线,而不管它属于哪个面?对不起necropost。 –

+1

@JohnP:请再次阅读我答案的第一句话。如果有两个顶点具有相同的位置,但不同的法线,则它们是*不同*顶点! Wavefront OBJ文件是错误的,因为它们称为*位置*“顶点”(它们不是,它们只是位置),并且脸部记录索引到“顶点”和“顶点正常”记录(记录的专有名称将是“位置记录“和”正常记录“)。 – datenwolf