OpenGL:很多小的VBO没关系好吗?

时间:2012-02-03 19:42:34

标签: opengl colors vbo vertex-buffer

我有很多物品,但我想要其中一个物体(鼠标悬停在其上)以“发光”(快速改变颜色)。

所以一种方法是让每个对象都有自己的VBO。我不会有彩色阵列。然后我会喜欢,一千个VBO,每个都有大约20个四边形...如果它是选定的对象,我会在它之前调用glColor3f(blah,blah,blah),否则它将是默认颜色。

另一种方法是将它们全部放在一个大的VBO中。我将有一个彩色阵列。然后我会非常频繁地将glBufferSubDataARB做成颜色数组,以使一个对象发光。

哪种方式更好,为什么?如果两种方式都不好,还建议另一种方式。

3 个答案:

答案 0 :(得分:6)

你知道吗?忘了颜色数组。颜色数组是没有意义的,因为每个顶点没有不同的颜色,但对于整个对象组。

将所有顶点数据放入单个VBO中,不带任何颜色数据。

然后遍历颜色(或对象组),为每个人调用glColor3fglDrawArrays,其中firstcount参数与数字匹配属于该颜色对象的顶点。

有一天当您从固定功能管道移动到着色器时,您只需将glColor3f替换为glUniform3f

答案 1 :(得分:0)

绝对是一个更大的VBO。原因很简单。如果您有许多VBO,则必须在每次绘制调用之前为每个VBO绑定缓冲区。

编辑:同时阅读你想要使用多个VBO的原因让我很奇怪。为什么不在着色器中将颜色变量作为统一变量传递?

答案 2 :(得分:0)

有多少种不同的颜色?你可以一次性将它们全部放入VBO中,只需使用glColorPointer为每个帧选择对象的VBO的不同部分吗?将偏移量更改为VBO比绑定不同的缓冲区或将新数据上传到缓冲区更有效。

基本上我建议你绘制一堆正常的未选择对象,然后调用glColorPointer选择高亮颜色,然后绘制所选对象,然后调用glColorPointer将VBO偏移回来,然后绘制剩余的对象。

仅仅因为所有顶点和颜色数据都在一个VBO中并不意味着你必须通过一次调用渲染所有对象。