2010-04-16 237 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); 

除了最后一个以外的所有顶点都是红色的。现在我想知道是否有一种方法可以在这些顶点之间插入颜色,而不需要在每个顶点手动插入颜色(而不是像本机一样,就像opengl自动完成的那样),因为我将在各个顶点处获得更多数量的颜色顶点。任何帮助将不胜感激。

谢谢!

回答

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不会自己尝试这样做。

编辑:跨半球渐变,我想尝试这样的事:

// 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 2010-04-16 21:15:38

+0

@gutsblow:也许你最好告诉我们更多关于你真正想要完成的事情。马上就会发现,在适当的位置使用红色和蓝色灯光的中性色球体会更好。 – 2010-04-16 21:28:44

+0

对不起,因为含糊不清。这正是我所想到的,一个巨大的球体/半球,作为一个天体。我可以对其应用纹理,但是我想要具有可以由颜色的位置控制的颜色渐变。再次感谢! – rwb 2010-04-16 22:41:02

1

OpenGL将在多边形内插值,但不跨多边形。