我正在使用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中它匹配红色)。
事实上,它可以导致额外的内存使用量来正确地绘制所有内容。
还有其他可能的方法将颜色与元素联系起来吗?
答案 0 :(得分:3)
如果将Shademodel设置为平滑,它将插入颜色。
glShadeModel(GL_SMOOTH);
或者你到底想要达到什么目的?缓冲区中三角形只有一种颜色?这不起作用,你必须为每个顶点指定一种颜色......
答案 1 :(得分:2)
您需要了解的一点是,顶点不仅仅是它的位置。顶点(以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的数据模型的设计方式不是可以将每个属性放在一个自己的数组中,并用索引向量来解决它们。此类数据模型也会在实现高效缓存方面造成重大困难,因此会严重降低性能。
你还告诉你内存不足。大多数现代系统为您提供几千兆字节的图形客户端(即CPU)内存和至少几百兆的图形服务器(即GPU)内存。可以放入GPU内存的几何数据量(即顶点)超出了GPU的实时处理能力;这也将是比屏幕上可用像素更多的顶点。所以我很肯定你不太可能遇到任何内存问题,你的瓶颈将是另一个。