Интерполяция цвета OpenGL по вершинам

Прямо сейчас у меня есть более 25 вершин, которые образуют модель. Я хочу линейно интерполировать цвет между первой и последней вершиной. Проблема в том, что когда я пишу следующий код

glColor3f(1.0,0.0,0.0);
vertex3f(1.0,1.0,1.0);
vertex3f(0.9,1.0,1.0);
.
.`<more vertices>;
glColor3f(0.0,0.0,1.0);
vertex3f(0.0,0.0,0.0);

Все вершины, кроме последней, красные. Теперь мне интересно, есть ли способ интерполировать цвет по этим вершинам без необходимости вручную интерполировать цвет (вместо этого изначально, как это делает opengl автоматически) в каждой вершине, поскольку у меня будет гораздо больше цветов в разных точках. вершины. Любая помощь будет чрезвычайно признательна.

Спасибо!


person rwb    schedule 16.04.2010    source источник


Ответы (2)


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 не пытается сделать это самостоятельно.

Изменить: для градиента по полушарию я бы попробовал что-то вроде этого:

// 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);

На данный момент я сделал внешнюю часть сферы, но полусфера не сильно отличается.

person Jerry Coffin    schedule 16.04.2010
comment
Благодарю за ваш ответ. Ваш ответ определенно имеет смысл. Теперь вопрос в том, могу ли я применить эту логику к полушарию? У меня огромное полушарие, и я хочу иметь разные цвета в разных положениях. Я не уверен, что эта логика работает, поэтому, как вы думаете, может быть, мне лучше вычислить цвет в отдельных вершинах? Еще раз спасибо, что нашли время. - person rwb; 17.04.2010
comment
@gutsblow: Возможно, вам лучше рассказать нам немного больше о том, чего вы действительно пытаетесь достичь. С самого начала кажется, что вам лучше использовать сферу нейтрального цвета с красными и синими огнями в соответствующих местах. - person Jerry Coffin; 17.04.2010
comment
Извините, за расплывчатость. Вот что я имею в виду, огромная сфера/полусфера, которая работает как небесный купол. Я могу применить к нему текстуры, но я хочу иметь градиент цветов, которым можно управлять с помощью положения цветов. Спасибо еще раз! - person rwb; 17.04.2010
comment
Спасибо большое. Этот метод работает очень хорошо. Поскольку я новичок в OpenGL, я не знал, что существует прямая функция для создания сферы, которая значительно упрощает мою жизнь. Спасибо! - person rwb; 17.04.2010

OpenGL будет интерполировать цвет внутри полигонов, но не между полигонами.

person brainjam    schedule 16.04.2010