2011-08-17 103 views
2

我正在使用VBO创建一个应用程序来渲染一些具有困难颜色结构的对象。我注意到,VBO定义元素的颜色等于元素缓冲区中的最后一个顶点索引。例如,当我使用点阵列这样如何将元素映射到OpenGL 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

你真的需要双色类型的颜色吗?如果内存不足,则使用GL_UNSIGNED_BYTE作为颜色缓冲区,所以R,G,B,A总共需要4个字节,而不是24个字节,因为您的实现会执行此操作(如果我正确理解了您的代码)。你也不需要双打你的顶点位置。除了颜色以外,只需使用浮标。 – Rookie

+0

这只是一个例子,我并不需要双倍的颜色,我知道。 但是因为我在很小的区域内运行着大量的顶点,所以我需要这样的精度,所以我必须使用顶点的双精度。 无论如何谢谢 – user898722

+0

user898722:我编辑了你的问题,使其更容易理解。请检查我没有因此引入一些错误。 (随意恢复我的编辑。) –

回答

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

3

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

glShadeModel(GL_SMOOTH);

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

+0

问题是一个顶点可能属于几个元素,用不同的颜色绘制。所以我需要重复顶点? – user898722

+0

是,重复顶点或更改颜色缓冲区。也许还有其他的可能性,比如使用着色器...我不知道这个.. – DeyyyFF

+0

谢谢你,我正在寻找“其他可能性”,因为我在内存上非常有限。 – user898722