我正在使用VBO创建一个应用程序,以渲染一些具有困难颜色结构的对象。我注意到,VBO将元素的颜色定义为等于元素缓冲区中的最后一个顶点索引。例如,当我使用这样的点数组时

    double pointBuf[]={    -0.1d,  0.1d, 0,
                            0.1d,  0.1d, 0,
                            0.1d, -0.1d, 0};


颜色阵列:

    double colorBuf[] = {   0d, 1d, 0d,
                            0d, 1d, 0d,
                            1d, 0d, 0d};


和元素数组:

   int elementBuf[] = {0, 1, 2};


绘制一个三角形,它将是红色的(因为elementBuf中的最后一个元素是2,在colorBuf中它匹配红色)。

实际上,它可能会导致额外的内存使用,从而无法正确绘制所有内容。

有没有其他可能的方法可以将颜色与元素链接起来?

最佳答案

您需要了解的一件事是,顶点不仅仅是其位置。顶点(用OpenGL术语)是属性的整个向量

/ pos_x        \
| pos_y        |
| pos_y        |
| normal_x     |
| normal_y     |
| normal_z     |
| color_r      |
| color_g      |
| color_b      |
| color_a      |
| texcoord0_s  |
| texcoord0_t  |
| texcoord0_r  |
| texcoord0_q  |
| texcoord1_s  |
| texcoord1_t  |
| texcoord1_r  |
| texcoord1_q  |
| …            |
| texcoordN_s  |
| texcoordN_t  |
| texcoordN_r  |
| texcoordN_q  |
| …            |
| attrib0      |
| …            |
\ attribM      /


如果更改其中任何一个,最终将获得完全不同的顶点。 OpenGL的数据模型的设计方式无法将每个属性放置在自己的数组中,并使用索引向量对其进行寻址。同样,这种数据模型将在实现高效缓存方面造成重大困难,因此会严重降低性能。

您还告诉您内存不足。大多数现代系统都会为您提供几GB的图形客户端(即CPU)内存和至少几百MB的图形服务器(即GPU)内存。您可以放入GPU内存中的几何数据(即顶点)数量超出了GPU的实时处理能力;而且顶点比屏幕上可用的像素还要多。因此,我很肯定您不会遇到任何内存问题,您的瓶颈将是另一个瓶颈。

09-04 06:03
查看更多