如何使用相同的VBO绘制多个对象

我有一段时间一直坚持这个问题,也许是因为我不知道究竟要search什么,这可能是一个我还没有听说过的术语,因为大多数教程在绘制一个对象到屏幕后结束一个VBO。

作为OpenGL以及GLSL的新手我至less知道几件事情,一个是你总是希望尽可能less地发送CPU – > GPU的信息,尽可能less地发送(最好是发送所有的数据一次,而不是每帧很多小包装)。 知道这一点告诉我,绘制许多相同的对象,比如一个茶壶,一定要有更好的方法,然后循环“glDrawArrays”然后重复这个步骤。

应该可以发送一些包含你想绘制的茶壶数量的数组,以及你想要的所有位置/变换matrix。

我知道我可以把多个茶壶放到同一个VBO中,并且所有的顶点数据偏移,但是这会使顶点数据增加一倍,使它变得不够灵活,对我来说这似乎是一个糟糕的解决scheme。

那么在不同的转换过程中使用一个或几个绘制调用画出许多相同的VBO是正确的解决scheme?

你正在寻找的是实例 。 您只需调用glDrawArraysInstanced​ glDrawElementsInstanced​传递所需的实例数。 有两种方法可以确定每个实例的数据:

  1. gl_InstanceID顶点着色器input告诉你当前正在处理哪个实例。 你的顶点着色器可以有一个内部机制来获得对应于当前gl_InstanceID的正确数据。 例如,它可以用它来索引表。

  2. 您可以使用实例化数组 ,这会导致通用顶点属性数组按实例进行索引,而不是按元素索引进行索引。 例如, glVertexAttribDivisor​(attrib​, 1​)告诉OpenGL将每个实例的索引增加到顶点属性attribglVertexAttribDivisor​(attrib​, 2​)会每增加一个实例就增加索引。