多个网格或单个网格中的多个对象

Multiple meshes or multiple objects in a single mesh?

本文关键字:网格 对象 单个      更新时间:2023-10-16

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

同样在我的代码中,我有。。。

loc1=glGetAttribLocation(阴影p,"顶点_位置");

现在我明白了,这会得到我当前程序中的顶点位置,但如果我想加载另一个对象,我会加载网格,然后我如何才能再次得到顶点位置,而只针对那个网格?

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

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

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

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

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