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

Java 如何在OpenGL VBO中将元素映射到颜色?,java,opengl,jogl,vbo,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

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

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


是否有其他可能的方法将颜色与元素链接?

如果将Shademodel设置为“平滑”,它将插值颜色

glShadeModel(GL_平滑)


或者你到底想要实现什么?缓冲区中三角形只有一种颜色?这是行不通的,你必须为每个顶点指定一种颜色…

你需要了解的一件事是,顶点不仅仅是它的位置。顶点(在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的实时处理能力;此外,这将是远远超过你的屏幕上可用的像素顶点。所以我敢肯定,您不太可能遇到任何内存问题,您的瓶颈将是另一个。

问题是一个顶点可以属于多个元素,以不同的颜色绘制。所以我需要复制顶点?是的,复制顶点或更改颜色缓冲区。也许还有其他的可能性,比如使用着色器。。。我对此不确定。谢谢你,我正在寻找“其他可能性”,因为我的内存非常有限。默认情况下glShadeModel是GLU平滑的。你的颜色真的需要双字体吗?如果内存不足,请使用GL_UNSIGNED_BYTE作为颜色缓冲区,因此R、G、B、A总共需要4个字节,而不是实现时的24个字节(如果我正确理解了代码)。此外,顶点位置也不需要双精度。除了颜色之外,所有的东西都使用浮动。这只是一个例子,我知道,我真的不需要双色。但由于我在小范围内操作大量顶点,我确实需要这样的精度,所以我必须对顶点使用double。无论如何,谢谢用户898722:我对你的问题进行了编辑,使它更容易理解。请检查我没有因此引入一些错误。(请随时恢复我的编辑。)如果您对任何顶点属性使用双精度,您也可以放弃性能。只有在GL 4.x中才支持属性的双精度运算,即使在这种情况下,性能也会大大降低。浮点数可获得约7位精度。小的和大的与浮点值相关,所以除非你真的看到问题,否则坚持使用浮点。在询问OpenGL相关问题时,请始终指定你的OpenGL版本。