1

我有很多对象,但我希望这些对象之一(鼠标悬停的那个)“发光”(快速改变颜色)。

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

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

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

4

3 回答 3

6

你知道一些事情?只需忘记颜色数组。颜色数组没有意义,因为每个顶点没有不同的颜色,而是整个对象组。

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

然后循环遍历颜色(或对象组),对于您将调用的每个颜色glColor3fand glDrawArrays,其中firstandcount参数与属于该颜色对象的顶点数匹配。

当你有一天从固定功能管道转移到着色器时,你只需glColor3fglUniform3f.

于 2012-02-03T20:29:11.030 回答
0

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

编辑:另外阅读你想使用多个 VBO 的原因让我想知道。为什么不在着色器中将颜色变量作为统一变量传递?

于 2012-02-03T19:45:54.553 回答
0

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

本质上,我建议您绘制一堆普通的未选中对象,然后调用glColorPointer以选择突出显示颜色,然后绘制选定对象,然后调用glColorPointer以将 VBO 偏移量放回原处,然后绘制剩余的对象。

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

于 2012-02-03T19:47:53.810 回答