Как мне сопоставить элементы с цветами в OpenGL VBO? - PullRequest
2 голосов
/ 17 августа 2011

Я создаю приложение, использующее 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 ]

3 голосов
/ 17 августа 2011

Если вы установите сглаживание Shademodel, он будет интерполировать цвета.

glShadeModel (GL_SMOOTH);

или чего именно вы хотите достичь?только один цвет для треугольника в буфере?это не работает, вы должны указать цвет для каждой вершины ...

2 голосов
/ 19 августа 2011

Одна вещь, которую вам нужно понять, это то, что вершина - это не просто ее позиция.Вершина (в терминах 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 не была разработана таким образом, чтобы можно было поместить каждый из атрибутов в собственный массив и адресовать их с помощью векторов индекса.Кроме того, такого рода модель данных создаст серьезные трудности при реализации эффективного кэширования, что серьезно ухудшит производительность.

Также вы говорите, что у вас недостаточно памяти.Большинство современных систем предлагают вам несколько гигабайт памяти графического клиента (т.е. процессора) и, по крайней мере, несколько сотен мегабайт памяти графического сервера (то есть графического процессора).Объем геометрических данных (т. Е. Вершин), которые вы можете поместить в память GPU, превышает возможности GPU в режиме реального времени;также это будет гораздо больше вершин, чем пикселей на вашем экране.Так что я уверен, что вы вряд ли столкнетесь с какими-либо проблемами с памятью, ваше узкое место будет / является другим.

...