我正在使用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的实时处理能力;而且顶点比屏幕上可用的像素还要多。因此,我很肯定您不会遇到任何内存问题,您的瓶颈将是另一个瓶颈。