使用多个openGL VBO绘制多个模型



而不是发布大量代码,我会直观地提出这个问题。我希望你了解我的意思。

我正在制作游戏,在代码中,我有一个模型类,该类别加载模型并为其设置VBO。

在加载函数中,它生成新的VBO ID,并通过绑定该缓冲区将顶点数据从文件加载到该缓冲区等。

在程序的开头,我制作一个模型对象并加载一个.obj文件。

在渲染函数中,我只需调用drawarrays()函数(带有必要的额外内容),正如我所说,一切正常,因为该模型出现在屏幕上,没有问题。/p>

但是,问题是,当我在程序开头制作两个模型对象并将不同的.OBJ文件加载到每个文件中时。

问题是,当我播放时,仅在屏幕上绘制第二个模型。

问题是因为我不正确地了解VBO的工作方式。

这就是我"思考" VBO的工作的方式。

您可以根据需要生成尽可能多的VBO ID。您可以绑定每个ID以使其成为活动缓冲区。您可以将顶点数据加载到该缓冲区中。现在,您有效地拥有许多不同的ID,每个ID都指"一组顶点数据"。通过调用Drawarray功能,它绘制了您生成的每个缓冲区(有效地在屏幕上显示所有模型)

现在我知道这是错误的,因为在我有限的理解中,我看不到如何打开/关闭模型。但是,无论我看多少个教程,我都无法回答这个问题,因为它们都专注于显示一个第一个vbo ,我可以做到。

所以...如果这很有意义,有人可以启发我吗?

您的做法大多是正确的,但是绘图命令不是绘制您生成的每个缓冲区。如果要用不同的缓冲区数据绘制2个对象,则必须发出2个绘图命令。

让我根据我的方式解释:

您使用GlgenBuffer创建缓冲区。在使用缓冲区之前,您必须"绑定"它,也就是说,使用GlbindBuffer使其处于活动状态。当缓冲区处于活动状态时,您可以使用它进行操作(例如,填充数据)。请注意,有不同的绑定目标,因此您可以具有一个活动数组缓冲区(用于顶点数据)和一个活动元素数组缓冲区(对于索引数据)。

当您想绘制内容时,您必须指定要绘制的确切绘制(我假设您正在使用自己的着色器)通常至少指定您的顶点数据和索引数据。为此,您首先使用顶点数据(作为数组缓冲区)绑定缓冲区,然后使用您的属性ID调用GlverTexAttribPointer。这告诉OpenGL界限现在是当前属性的源。然后,将索引缓冲区绑定为元素阵列缓冲区,并调用gldrawelements(不确定Gldrawarrays在这里如何工作)。

您不能一次使用多个VBO进行相同属性 - 绑定另一个缓冲区的调用只是覆盖了上一个调用并使第二个缓冲区活动活动,这就是为什么只绘制第二个对象的原因。

您也可以使用VAO简化绘图 - 基本上您将ID分配给绑定命令,然后您可以使用一行执行它们(想想显示列表)。

所以,我的加载(一个对象)看起来像这样:

  1. 创建缓冲区(假设缓冲区1用于顶点数据,缓冲区2用于索引数据)。
  2. 绑定缓冲区1作为数组缓冲区。
  3. 用顶点数据加注缓冲区。
  4. 缓冲区2作为元素阵列缓冲区和索引数据的重复2和3。

和我的图纸(再次,一个对象):

  1. 绑定缓冲区1作为数组缓冲区。
  2. 使用glvertexattribpointer指定此缓冲区转到特定属性。
  3. 绑定缓冲区2作为元素阵列缓冲区。
  4. 呼叫抽签

对于第二个对象,您必须重复所有内容。

遵循以下步骤渲染模型,假设Model1顶点存储在Vertexbuffer和Model2顶点中,则在Vertexbuffer2中:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);        
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, <no. of vert>);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2);
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, <no. of vert>);
//swap buffers depending on your windowing toolkit

请确保不要在两个模型渲染的中间执行Glclear。最好!

您要做的是将vertexarrayattribute设置为第一个对象数据,然后每个调用drawarrays

绘制阵列函数使用存储在VAO中的绑定来查找渲染所有内容所需的数据

因此,要渲染2个模型,您可以创建第二个VAO绑定它,并根据需要调用GlverTexAttribPointer。为了绘制,您可以绑定VAO并为每种型号拨打抽签

最新更新