【问题标题】:Multiple meshes or multiple objects in a single mesh?多个网格或单个网格中的多个对象?
【发布时间】:2013-12-26 18:25:33
【问题描述】:

我正在尝试将多个对象加载到 opengl 中的 vbo 中。如果我希望能够独立移动这些对象,我应该为每个对象使用网格还是应该将所有对象加载到单个网格中?

在我的代码中我也有...

loc1 = glGetAttribLocation(shaderP, "vertex_position");

现在我知道这会获取当前程序中的顶点位置,但如果我想加载另一个对象,我会加载网格,然后我如何才能再次获取顶点位置,但仅针对该网格?

【问题讨论】:

    标签: c++ opengl mesh


    【解决方案1】:

    答案通常是“视情况而定”。每个对象有一个“网格”(即一个缓冲区)可以说是“更干净”,但它也可能更慢。每个对象一个缓冲区将使您更频繁地绑定不同的缓冲区。微小的顶点缓冲区对象(几十个顶点)与巨大的顶点缓冲区对象(千兆字节的数据)一样糟糕。你应该尝试在两者之间找到一个“合理”的东西

    自 3.2 版起随时可用的glDrawElementsBaseVertex(也作为实例版本存在)将允许您从一个缓冲区无缝绘制多个对象或片段,而无需摆弄重新编号的索引,也无需切换缓冲区。

    您最好(假设 OpenGL 3.3 可用)根本不使用glGetAttribLocation,而是使用布局说明符assign the attribute to a location。这样您就知道位置,无需每次都询问,也不必担心可能会发生“奇怪、意想不到的事情”。
    如果您不能在着色器中执行此操作,请改用 glBindAttribLocation(自 2.0 版起可用)。它有点不太舒服,但做同样的事情。您可以决定位置,而不是要求它并担心编译器希望不会更改两个不同着色器的顺序。

    【讨论】:

      【解决方案2】:

      如果为不同的对象使用不同的缓冲区,通常会更干净。

      根据: http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml 这只会返回指向数据位置的指针。您使用它来将您的顶点信息绑定到程序。当您渲染其他对象时,您将绑定到存储其他顶点的 vbo。

      【讨论】:

      • 好的,但是我应该为所有对象使用一个网格还是多个网格?
      • 使用多个网格会更干净。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2021-05-05
      • 2018-10-24
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多