6

我在理解如何使用 OpenGL 处理/渲染多个对象时遇到了一点困难。我环顾四周,在谷歌和 OpenGL 红皮书中找到了答案,这些答案与我试图弄清楚的内容类似,但我需要看看我是否有正确的想法。

我的第一个想法是我应该分别处理带有 X、Y 和 Z 的平移和旋转变量的位置数据。将单个网格存储在该类的静态 VBO 中,然后对于我要渲染的每个实例执行 for-next 循环

  • 加载标识
  • 变换到特定对象的位置/旋转
  • 使用 drawarrays 在该位置渲染网格
  • 循环到下一个对象并为每个对象重复上述操作

为每个帧更新处理这样的转换是否会显着影响性能?

有人提到的另一种方法是将每个顶点的所有位置数据粘贴在单个 VBO 中,然后通过单个调用对其进行渲染。在这种方法中,我假设“创建”一个对象,我需要通过一个函数处理每个顶点的位置数据,该函数将获取其局部坐标(通过静态数组)并将该特定对象的位置数据添加到顶点,然后将其存储在 VBO 中?如果是这种情况,我将如何处理旋转?

我的第三个想法是在对象的每个实例中存储一个 4x4 矩阵来保存平移/旋转信息,然后当我去渲染时,我只需加载该对象的矩阵,从单个 VBO 绘制网格,然后加载下一个对象的矩阵,从同一个 VBO 中绘制,等等......

最后,我看到有些人建议为每个对象设置一个 VBO,并为每个实例调用 drawarray。这种方式对我来说似乎非常低效,并且让我想知道如果您为每个网格都调用它,那么拥有 VBO 的意义何在。似乎立即模式(我知道它已贬值)会更快,因为您没有为每个对象创建和绑定 VBO 的开销。

这些处理/渲染多个对象的任何/所有方法是否有效?如果是这样,每种方法的优缺点是什么?

最有意义的方法是每个网格有一个 VBO,然后在每次更新时转换它们,或者在每次更新时加载每个对象的矩阵并以这种方式渲染。我对 OpenGL 和图形渲染还很陌生,所以我试图完全理解处理渲染多个对象所需信息的最佳方法。

4

1 回答 1

3
  • 变换到特定对象的位置/旋转

这只是意味着您将 4x4 矩阵加载到统一变量。

为每个帧更新处理这样的转换是否会显着影响性能?

转换将在您的顶点着色器中执行,通过将上述矩阵乘以顶点坐标,并行处理许多顶点。

有人提到的另一种方法是将每个顶点的所有位置数据粘贴在单个 VBO 中,然后通过单个调用对其进行渲染。在这种方法中,我假设“创建”一个对象,我需要通过一个函数处理每个顶点的位置数据,该函数将获取其局部坐标(通过静态数组)并将该特定对象的位置数据添加到顶点,然后将其存储在 VBO 中?如果是这种情况,我将如何处理旋转?

这似乎不是一个好主意,因为您必须在每一帧上上传数据(或者至少在对象位置/方向发生变化时)。

第三种方法似乎与第一种相同,只是在 OGL3+ 术语中,而第一种似乎在 OGL 2.x 术语中:)

最后,我看到有些人建议为每个对象设置一个 VBO,并为每个实例调用 drawarray。

也许您误解了,他们的意思是 VAO,而不是 VBO?使用 VAO,您上传顶点属性(在 VBO 中),绑定 VAO,将每个 VBO 绑定到适当的属性位置,并且在开始时只执行一次。在每一帧上,您只需执行以下操作:

// Bind the VAO
glBindVertexArray(vao)

// Draw the object
glDrawArrays/glDrawArraysInstanced/etc.

// CLear VAO binding
glBindVertexArray(0)

请注意,您仍然可以在同一个 VBO 中为许多不同的对象拥有顶点属性,记住glDrawArrays和其他人有一个参数,该参数决定从数组中的哪个位置开始绘制。

于 2012-11-22T08:20:38.030 回答