2

我正在使用 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 中它匹配红色)。

事实上,它会导致额外的内存使用来正确绘制所有内容。

有没有其他可能的方式将颜色与元素联系起来?

4

2 回答 2

3

如果将 Shademodel 设置为平滑,它将插入颜色。

glShadeModel(GL_SMOOTH);

或者你到底想达到什么目的?缓冲区中的三角形只有一种颜色?这不起作用,您必须为每个顶点指定一种颜色...

于 2011-08-17T13:50:00.193 回答
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 的数据模型并没有被设计成可以将每个属性放在一个自己的数组中并使用索引向量对其进行寻址。而且这种数据模型在实现高效缓存方面会造成很大的困难,因此会严重降低性能。

您还告诉您内存不足。大多数现代系统为您提供数 GB 的图形客户端(即 CPU)内存和至少数百兆字节的图形服务器(即 GPU)内存。您可以放入 GPU 内存的几何数据(即顶点)的数量超过了 GPU 的实时处理能力;这也将比屏幕上可用的像素多得多的顶点。所以我很肯定你不太可能遇到任何内存问题,你的瓶颈将是/是另一个。

于 2011-08-19T09:28:02.637 回答