2010-04-16 301 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將在多邊形內插值,但不跨多邊形。