关于C#:OpenGL VBO批处理最佳实践

OpenGL VBO batch best practices

我正在创建一个 2d 游戏引擎作为一个副项目。我一直在做一些实验和研究,遇到很多人建议你在同一个 VBO 中批处理(存储多个要绘制的对象)。例如,如果我的场景有很多树,我可以将所有树放在同一个 VBO 中,因为它们具有相同的内存占用,然后使用单个 glDrawArrays 来绘制所有树。

这很好,而且很有意义......但后来我开始想知道如何为每棵树发送不同的变换?我如何将它传递给着色器?或者这种方法是否假设我在 CPU 上进行计算并在每次绘制时发送整个 VBO?

以下是我一直在研究的两个主要问题:

OpenGL VAO 最佳实践

OpenGL 有多少 VAO


您要查找的术语是 Instancing。

您创建一个包含树模型的 VAO,然后将模型矩阵不是通过制服传递,而是将其作为实例化的顶点属性放在 VAO 中。然后,您的树的每个实例都将使用不同的模型矩阵绘制。

您可以利用计算着色器或变换反馈在每个实例每帧更新和存储模型视图产品一次(而不是按每个实例的每个顶点计算)。