OpenGL处理​​多个对象

Dav*_*rey 6 opengl rendering transformation object matrix

我在理解如何使用OpenGL处理​​/渲染多个对象时遇到了一些困难.我环顾四周,在谷歌和OpenGL红皮书中找到答案,围绕着我想弄清楚的东西跳舞,但我需要看看我是否有正确的想法.

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

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

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

有人提到的另一种方法是在一个VBO中粘贴每个顶点的所有位置数据,然后用一次调用渲染它.在这个方法中,我假设"创建"一个对象,我需要通过一个函数来处理每个顶点的位置数据,该函数将获取其本地坐标(通过静态数组)并将该特定对象的位置数据添加到顶点,然后把它存放在VBO中?如果是这种情况,我将如何处理轮换?

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

最后,我看到有人建议为每个对象都有一个VBO,并为每个实例调用drawarray.这种方式对我来说似乎效率很低,让我想知道如果你为每个网格调用VBO,那么VBO会是什么意思.看起来像立即模式(我理解它被折旧)会更快,因为你没有为每个单个对象创建和绑定VBO的开销.

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

最有意义的方法是每个网格具有单个VBO的方法,然后根据更新转换它们,或者每次更新加载每个对象的矩阵并以此方式呈现.我是OpenGL和图形渲染的新手,所以我试图完全理解处理渲染多个对象所需信息的最佳方法.

chi*_*ill 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)
Run Code Online (Sandbox Code Playgroud)

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