OpenGL跨顶点的颜色插值

OpenGL跨顶点的颜色插值,opengl,graphics,colors,3d,interpolation,Opengl,Graphics,Colors,3d,Interpolation,现在,我有超过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); glColor3f(1.0,0.0,0.0); 顶点3f(1.0,1.0,1.0); 顶点3f(0

现在,我有超过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);
glColor3f(1.0,0.0,0.0);
顶点3f(1.0,1.0,1.0);
顶点3f(0.9,1.0,1.0);
.
.`;
GL3F(0.0,0.0,1.0);
顶点3f(0.0,0.0,0.0);
除最后一个顶点外,所有顶点均为红色。现在我想知道是否有一种方法可以在这些顶点上插值颜色,而不必在每个顶点上手动插值颜色(而不是像opengl那样自动插值),因为我将在各个顶点上拥有更多的颜色。任何帮助都将不胜感激


谢谢大家!

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将在多边形内插值颜色,但不会跨多边形插值颜色。

感谢您的回复。你的回答绝对有道理。现在的问题是我能把这个逻辑应用到半球上吗?我有一个巨大的半球,我想在不同的位置有不同的颜色。我不确定这个逻辑是否有效,所以您认为我最好在单个顶点计算颜色吗?再次感谢您抽出时间。@gutsblow:也许您最好多告诉我们一些您真正想要完成的事情。马上,听起来你最好用一个中性颜色的球体,在适当的位置用红光和蓝光。抱歉,说得太模糊了。这就是我的想法,一个巨大的球体/半球,就像一个天穹。我可以应用纹理,但我想有一个梯度的颜色,可以控制的位置的颜色。再次感谢!非常感谢你。这种方法非常有效。因为我是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);