На редактирование по цветам:
OpenGL на самом деле является конечным автоматом. Это означает, что при рисовании используется текущая позиция материала и / или цвета. Поскольку вы, вероятно, не будете использовать материалы, игнорируйте это сейчас. Вы хотите цвета.
glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)
Это повлияет на цвета любых вершин, которые вы рисуете, любой геометрии, которую вы визуализируете - будь то глю или ваша собственная - после того, как вызов glColorXX был выполнен. Если вы рисуете грань с вершинами и меняете цвет между вызовами glVertex3f / glVertex2f, цвета интерполируются.
Попробуйте это:
glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();
Но я уже указал на glColor4f, поэтому я предполагаю, что вы хотите установить цвета для каждой вершины. И вы хотите рендеринга с использованием списков отображения.
Так же, как вы можете отображать списки вершин, вы также можете сделать так, чтобы у них был список цветов: все, что вам нужно сделать, это включить списки цветов и сообщить opengl, где находится список. Конечно, они должны иметь такой же наряд, как и список вершин (в том же порядке).
Если бы у вас было
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);
Вы должны добавить цвета таким образом. Они не должны быть плавающими; на самом деле, вы говорите, в каком формате это должно быть. Для списка цветов с 1 байтом на канал и 4 каналами (R, G, B и A) используйте это:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
EDIT: забыл добавить, что вы должны сообщить OpenGL, какие элементы рисовать, вызвав glDrawElements .