【问题标题】:OpenGL VBO batch best practicesOpenGL VBO 批处理最佳实践
【发布时间】:2017-04-27 19:43:56
【问题描述】:

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

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

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

OpenGL VAO best practices

OpenGL How Many VAOs

【问题讨论】:

    标签: c++ opengl vbo vao


    【解决方案1】:

    您要查找的术语是Instancing

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

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

    【讨论】:

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