2010-04-16 4 views
2

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

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

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

Спасибо!

ответ

3

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

На данный момент, я сделал за пределами сферы, но делать полусферу не резко другой.

+0

Благодарим за отзыв. Ваш ответ определенно имеет смысл. Теперь вопрос в том, могу ли я применить эту логику к полушарию? У меня огромное полушарие, и я хочу иметь разные цвета на разных позициях. Я не уверен, что эта логика вполне работает, так что вы думаете, что мне может быть лучше, вычисляя цвет в отдельных вершинах? Еще раз спасибо за то, что вы нашли время. – rwb

+0

@gutsblow: Возможно, вам лучше рассказывать нам немного больше о том, чего вы действительно пытаетесь достичь. Сразу же кажется, что вам будет лучше с шаром в нейтральном цвете с красными и синими огнями в соответствующих положениях. –

+0

Извините, за туманность. Вот что я точно имею в виду, огромная сфера/полушарие, которое работает как skydome. Я могу применить к нему текстуры, но хочу иметь градиент цветов, которым можно управлять по положению цветов. Еще раз спасибо! – rwb

1

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

Смежные вопросы