2

我试图在顶点数组对象 (VAO) 中使用两个顶点缓冲区对象 (VBO) 和两个索引缓冲区对象 (IBO) 来渲染来自包含 3D 模型的波前 .Obj 文件的数据。.obj 文件使用顶点/法线定义

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

我意识到我不能使用两个 IBO 来对 OpenGL 的 VAO 进行索引,因为(一次)只能将一个缓冲区对象绑定到 GL_ELEMENT_ARRAY_BUFFER 绑定目标。这意味着我不能只定义顶点位置索引和顶点法线索引,当我需要两者作为 GLSL 顶点着色器的输入时,这是一个问题。

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

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

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

我正在使用带有 OpenGL 3.3 的 C++ 和 Visual Studio 2012。

4

1 回答 1

7

您必须了解的一件事是,“顶点”不是“位置”的同义词。一个顶点是整个属性集;位置、法线、纹理坐标等。OpenGL 一次处理一个图元,其中一个图元由 1 个(点)、2 个(线)或 3 个顶点(三角形)组成。您不能单独处理位置和正常,它们总是必须一起处理。

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

于 2013-01-03T23:30:35.947 回答