【问题标题】:Multiple "Sprites" in one VBO一个 VBO 中的多个“精灵”
【发布时间】:2021-02-12 16:44:33
【问题描述】:

据我了解,VBO 是 GPU 上的内存,我们可以在其中发送顶点,而 VAO 是您可以存储不同 VBO 的地方,然后您可以绑定这些 VBO 以绘制这些顶点。

如果我用一个 VBO 渲染了一个立方体,并且我想同时渲染另一个形状,例如金字塔,我会为每个“对象”创建一个 VBO,还是只是发送新的顶点位置。

我知道如何绘制一个或多个简单的立方体,但我不知道同时绘制多个不同的形状

【问题讨论】:

  • "同时" 你是什么意思?你只有 1 个 GPU,它一次只能做一件事。因此,其他形状要么在立方体之前渲染,要么在它之后渲染。它可能在同一个渲染命令中的之前/之后(在这种情况下,您不是“渲染立方体”;您只是在绘制 form 立方体的三角形),但是您'不是“同时”渲染它们。
  • 对不起,不清楚,我的意思是简单来说,在游戏中对屏幕上的所有对象使用 1 x VBO 会更好,还是应该为每个“对象”设置一个 VBO /精灵”?
  • 简单答案:只有一个 VBO,里面包含所有“对象/精灵”。

标签: opengl


【解决方案1】:

如果您在一个 VBO 中有多个对象。你可以使用Instancing。然后,您可以在 vbo 中创建 3 个 vec4 属性位置,并使用它在着色器中构造一个 mat4 对象[最后一行将是 0,0,0,1] 以进行转换。

如果您的整个网格仅由三角形或任何其他单一类型的图元组成,但如果您在 VBO 中混合了不同的拓扑结构,则上述方法将起作用,例如您使用索引三角形绘制的立方体,然后是您将要绘制的圆使用三角形扇形或类似的东西进行绘制,然后您将使用glDrawElementsBaseVertex,其中基本顶点是 vbo 中图元的起始顶点。

如果这些不同的基元中的每一个都有自己的实例属性,假设您想按顺序绘制 2 个绿色立方体,然后绘制 3 个红色圆圈 [其中颜色是每个实例属性,因此总共有 5 种颜色] 然后您可以使用glDrawElementsInstancedBaseVertexBaseInstance,您可以在其中指定从哪个实例[或者在这种情况下,从您想要从什么颜色开始渲染]

这取决于您的用例。如果我需要修改大型网格的顶点信息,那么将它们的负载存储在一个 VBO 中可能是一个问题,因为我必须跟踪每个网格开始的 vbo 中的偏移量,并且在交错属性后变得更加困难。

但是对于绘制精灵或一种网格类型的多个实例,您不经常修改 VBO 中的顶点数据,那么将所有数据存储在一个 VBO 中是一种不错的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多