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

Posted

技术标签:

【中文标题】如何将元素映射到 OpenGL VBO 中的颜色?【英文标题】:How can I map the elements to colors in OpenGL VBO? 【发布时间】:2011-08-17 13:41:53 【问题描述】:

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

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

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

【问题讨论】:

你的颜色真的需要双色吗?如果您的内存不足,请使用 GL_UNSIGNED_BYTE 作为颜色缓冲区,因此 R、G、B、A 总共需要 4 个字节,而不是像您的实现那样占用 24 个字节(如果我正确理解了您的代码)。您的顶点位置也不需要双打。只需对除颜色以外的所有内容使用浮点数。 这只是一个例子,我真的不需要双倍的颜色,我知道。但是由于我在小区域内使用大量顶点进行操作,所以我确实需要这样的精度,所以我必须对顶点使用双精度。还是谢谢 user898722:我编辑了您的问题以使其更易于理解。请检查我没有因此引入一些错误。 (随时恢复我的编辑。) 如果你对任何顶点属性使用双精度,你也可以丢掉性能。仅在 GL 4.x 中支持属性的双精度数,即使在那时,性能也会大大降低。浮点数的精度约为 7 位。小和大与浮点值是相对的,所以除非你真的发现问题,否则坚持使用浮点数。 在询问 OpenGL 相关问题时,请始终指定您的 OpenGL 版本。 【参考方案1】:

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

glShadeModel(GL_SMOOTH);

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

【讨论】:

问题是一个顶点可以属于多个元素,用不同的颜色绘制。所以我需要复制顶点? 是的,复制顶点或更改颜色缓冲区。也许还有其他可能性,比如使用着色器……我不确定…… 谢谢你,我正在寻找“其他可能性”,因为我的内存非常有限。 glShadeModel 默认为 GL_SMOOTH。【参考方案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 的实时处理能力;这也将比屏幕上可用的像素多得多的顶点。所以我很肯定你不太可能遇到任何内存问题,你的瓶颈将是/是另一个。

【讨论】:

以上是关于如何将元素映射到 OpenGL VBO 中的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

管理 OpenGL VBO 和颜色

OpenGL VAO VBO 着色器混淆

初识OpenGL (-)VAO&VBO

初识OpenGL (-)VAO&VBO

初识OpenGL (-)VAO&VBO

OpenGL,交错的 VBO(顶点、法线和颜色)与光