关于C#:OpenGL VBO批处理最佳实践 | 珊瑚贝

OpenGL VBO batch best practices


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

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

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

OpenGL VAO 最佳实践

OpenGL 有多少 VAO


您要查找的术语是 Instancing。

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

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

  • 啊,我的问题可能有点不清楚。我知道实例化,但每棵树的模型可能略有不同,但使用相同的纹理……也许纸板箱可能是一个更好的例子。如果您查看对第二个链接的响应,我对第一个问题的回答就是我在说什么。
  • 它不清楚你在问什么。他说的是静态几何,不管你问的是动画。根据纸板,听起来它们实际上可以用实例绘制..?
  • 我理解他的意思是在一个 VBO 中一个接一个地拥有多个对象,并使用 glDrawMulti*() 来绘制所有(比如 5 个)形状不同但使用相同纹理的对象。我要问的是你如何给他们不同的变换,因为你只是将 VBO 中的所有项目绘制在同一个位置,这有点没用?像您建议的那样实例化仅在您尝试多次渲染同一事物时才有效。我询问使用一个 glDraw 调用渲染不同的项目,因为所有对象都在一个 VBO 中。
  • @TomShar:如果您将多个对象打包到同一个 glDraw 调用中,那么它们的顶点坐标将已经被转换。


来源:https://www.codenong.com/41109378/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?