OpenGL будет интерполировать цвета пикселей между одной вершиной и следующей, но я не знаю, как это сделать, чтобы автоматически интерполировать значения для промежуточных вершин. Как правило, это не особенно сложно, хотя - вы не хотите, чтобы написать код для каждой отдельной вершины в любом случае, так что добавление вычисления довольно тривиально:
class pointf {
GLfloat x, y, z;
};
std::vector<pointf> spots;
// ...
GLfloat start_blue = 1.0f;
GLfloat end_blue = 0.0f;
GLfloat start_green = 0.0f;
GLfloat end_green = 0.0f;
GLfloat start_red = 0.0f;
GLfloat end_red = 1.0f;
GLfloat size = spots.size();
glBegin(GL_POLYGON);
for (int i=0; i<spots.size(); i++) {
GLfloat red = start_red + (end_red-start_red) * i/size;
GLfloat green = start_green + (end_green-start_green) * i/size;
GLfloat blue = start_blue + (end_blue-start_blue) * i/size;
glColor3f(red, green, blue);
glVertex3f(spots[i].x, spots[i].y, spots[i].z);
}
glEnd();
Одна вещь, хотя: это делает чисто линейной интерполяции для каждой вершины. Например, он не пытается учесть расстояние между одной вершиной и следующей. Я бы предположил, что вопросы о том, как делать такие вещи (по крайней мере, частично), почему OpenGL не пытается это сделать самостоятельно.
Edit: для градиента по полусфере, я хотел бы попробовать что-то вроде этого:
// Blue light on the left
GLfloat blue[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat blue_pos[] = {-1.0f, 0.0f, -0.3f, 0.0f};
// red light on the right
GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f};
GLfloat red_pos[] = {1.0f, 0.0f, -0.3f, 0.0f};
// turn on lighting:
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
// Set up the two lights:
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, blue);
glLightfv(GL_LIGHT0, GL_POSITION, blue_pos);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, red);
glLightfv(GL_LIGHT1, GL_POSITION, red_pos);
// set up the material for our sphere (light neutral gray):
GLfloat sph_mat[] = {0.8f, 0.8f, 0.8f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sph_mat);
// Draw a sphere:
GLUquadric *q = gluNewQuadric();
gluQuadricOrientation(q, GLU_OUTSIDE);
gluQuadricDrawStyle(q, GLU_FILL);
gluQuadricNormals(q, GLU_SMOOTH);
gluSphere(q, 1.0, 64, 64);
На данный момент, я сделал за пределами сферы, но делать полусферу не резко другой.
Благодарим за отзыв. Ваш ответ определенно имеет смысл. Теперь вопрос в том, могу ли я применить эту логику к полушарию? У меня огромное полушарие, и я хочу иметь разные цвета на разных позициях. Я не уверен, что эта логика вполне работает, так что вы думаете, что мне может быть лучше, вычисляя цвет в отдельных вершинах? Еще раз спасибо за то, что вы нашли время. – rwb
@gutsblow: Возможно, вам лучше рассказывать нам немного больше о том, чего вы действительно пытаетесь достичь. Сразу же кажется, что вам будет лучше с шаром в нейтральном цвете с красными и синими огнями в соответствующих положениях. –
Извините, за туманность. Вот что я точно имею в виду, огромная сфера/полушарие, которое работает как skydome. Я могу применить к нему текстуры, но хочу иметь градиент цветов, которым можно управлять по положению цветов. Еще раз спасибо! – rwb