我有很多物品,但我想要其中一个物体(鼠标悬停在其上)以“发光”(快速改变颜色)。
所以一种方法是让每个对象都有自己的VBO。我不会有彩色阵列。然后我会喜欢,一千个VBO,每个都有大约20个四边形...如果它是选定的对象,我会在它之前调用glColor3f(blah,blah,blah),否则它将是默认颜色。
另一种方法是将它们全部放在一个大的VBO中。我将有一个彩色阵列。然后我会非常频繁地将glBufferSubDataARB做成颜色数组,以使一个对象发光。
哪种方式更好,为什么?如果两种方式都不好,还建议另一种方式。
答案 0 :(得分:6)
将所有顶点数据放入单个VBO中,不带任何颜色数据。
然后遍历颜色(或对象组),为每个人调用glColor3f
和glDrawArrays
,其中first
和count
参数与数字匹配属于该颜色对象的顶点。
有一天当您从固定功能管道移动到着色器时,您只需将glColor3f
替换为glUniform3f
。
答案 1 :(得分:0)
绝对是一个更大的VBO。原因很简单。如果您有许多VBO,则必须在每次绘制调用之前为每个VBO绑定缓冲区。
编辑:同时阅读你想要使用多个VBO的原因让我很奇怪。为什么不在着色器中将颜色变量作为统一变量传递?
答案 2 :(得分:0)
有多少种不同的颜色?你可以一次性将它们全部放入VBO中,只需使用glColorPointer
为每个帧选择对象的VBO的不同部分吗?将偏移量更改为VBO比绑定不同的缓冲区或将新数据上传到缓冲区更有效。
基本上我建议你绘制一堆正常的未选择对象,然后调用glColorPointer
选择高亮颜色,然后绘制所选对象,然后调用glColorPointer
将VBO偏移回来,然后绘制剩余的对象。
仅仅因为所有顶点和颜色数据都在一个VBO中并不意味着你必须通过一次调用渲染所有对象。