我正在尝试将多个对象加载到opengl中的vbo中。如果我希望能够独立移动这些对象,我应该为每个对象使用网格,还是应该将所有对象加载到单个网格中?
同样在我的代码中我有......
loc1 = glGetAttribLocation(shaderP,“vertex_position”);
现在我明白这会获取当前程序中的顶点位置,但如果我想加载另一个对象,我会加载网格,然后如何再次获取顶点位置,但仅限于该网格?
答案 0 :(得分:1)
答案通常是“它取决于”。每个对象具有一个“网格”(即一个缓冲区)可以说是“更干净”但它也可能更慢。每个对象一个缓冲区将使您更频繁地绑定不同的缓冲区。微小的顶点缓冲对象(几十个顶点)与巨大的顶点缓冲对象(数十亿字节的数据)一样糟糕。您应该尝试在
之间找到“合理”的东西版本3.2随时可用glDrawElementsBaseVertex
(也作为实例版本存在)将允许您从一个缓冲区无缝绘制多个对象或片段,而无需编写重新编号索引,也无需切换缓冲区。
您应该优先(假设OpenGL 3.3可用性)根本不使用glGetAttribLocation
,而使用布局说明符assign the attribute to a location。这样你知道的位置,你不需要每次都询问,而且你不必担心会发生“奇怪的,意想不到的东西”。
如果您无法在着色器中执行此操作,请使用glBindAttribLocation
(从2.0版开始提供)。它有点不太舒服,但做同样的事情。您可以决定该位置,而不是要求它,并担心编译器希望不会更改两个不同着色器的顺序。
答案 1 :(得分:0)
如果为不同的对象使用不同的缓冲区,它通常会更清晰。
根据: http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml 这只会返回指向数据位置的指针。您可以使用它将顶点信息绑定到程序。渲染其他对象时,您将绑定到存储其他顶点的vbo。