如何在OpenGL VBO中将元素映射到颜色?

时间:2011-08-17 13:41:54

标签: java opengl jogl vbo

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

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

还有其他可能的方法将颜色与元素联系起来吗?

2 个答案:

答案 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的实时处理能力;这也将是比屏幕上可用像素更多的顶点。所以我很肯定你不太可能遇到任何内存问题,你的瓶颈将是另一个。