Вопрос: Меньше цветов, чем вершины


В старой устаревшей OpenGL мы могли бы сделать что-то вроде этого:

glBegin(...);
   glColor3f(r_1,g_1,b_1);
   glVertex3f(x_1, y_1, z_1);
   glVertex3f(x_2, y_2, z_2);
   ...
   glVertex3f(x_n, y_n, z_n);

   glColor3f(r_2, g_2, b_2);
   glVertex3f(x_(n+1), y_(n+1), z_(n+1));
   glVertex3f(x_(n+2), y_(n+2), z_(n+2));
   ...
   glVertex3f(x_2n, y_2n, z_2n);

   ...
glEnd();

То есть, я говорю, что каждая n последовательных вершин имеет один и тот же цвет. То же самое можно сделать с новым и не устаревшим OpenGL?

Например, если у меня есть куб, это означает, что у меня 36 вершин. Если я хочу, чтобы у каждого лица был 1 цвет, тогда каждая последовательная 6 вершин должна делиться этим цветом. В настоящее время я искусственно скопировал данные о цвете 6 раз для каждого цвета, чтобы размеры массива вершин и массива были одинаковыми. Есть ли другой способ обойти это? Надеюсь, мой вопрос был ясен.


5


источник


Ответы:


Возможно, этот псевдокод очищает вещи для вас:

GLfloat color_state{r,g,b};
GLfloat normal_state{x,y,z};
...

glColor4f(r,g,b,a):
    color_state.r = r
    color_state.g = g
    color_state.b = b
    color_state.a = a

glNormalf(x,y,z):
    normal_state.x = x
    normal_state.y = y
    normal_state.z = z

glVertex3f(x,y,z):
    __glinternal_submit_vertex(
        position = {x,y,z},
        normal = normal_state,
        color = color_state,
        ... );

Таким образом, OpenGL немедленно работает внутри. Цвета не разделялись между вершинами. Копия была создана из текущего состояния для каждой представленной вершины. Теперь, с помощью массивов Vertex и Vertex Buffer Object, на вас лежит бремя, чтобы сделать правильное дублирование данных.


10