Цветовая интерполяция OpenGL по вершинам - PullRequest
2 голосов
/ 17 апреля 2010

Сейчас у меня есть более 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 автоматически) в каждой вершине, так как у меня будет намного больше цветов на разных вершины. Буду очень признателен за любую помощь.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 апреля 2010

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

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

1 голос
/ 17 апреля 2010

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

...