2010-09-27 268 views
2

我想繪製一個5 * 5 * 5的立方體與六種不同的面部顏色。如何,當我這樣做時,它繪製單色,下面是立方體的代碼。Opengl基本立方體繪圖,但立方體繪製單色

void init(void) 
{ 
glClearColor(0,0,0,0); 
glShadeModel(GL_FLAT); 
} 

void DrawCube(void) 
{ 
glLoadIdentity(); 
gluLookAt(10, 10, 10, 0, 0, 0, 0, 1, 0); 
glBegin(GL_POLYGON); 

//face in xy plane 
glColor3f(0.82, 0.41, 0.12);//this the color with which complete cube is drawn. 
glVertex3f(0,0 ,0); 
glVertex3f(5, 0, 0); 
glVertex3f(5, 5, 0); 
glVertex3f(0, 5, 0); 

//face in yz plane 
glColor3f(1, 0, 0); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 0, 5); 
glVertex3f(0, 5, 0); 
glVertex3f(0, 5, 5); 

//face in zx plance 
glColor3f(0, 1, 0); 
glVertex3f(0, 0, 0 ); 
glVertex3f(0, 0, 5); 
glVertex3f(5, 0, 5); 
glVertex3f(5, 0, 0); 

//|| to xy plane. 
glColor3f(0, 0, 1); 
glVertex3f(0, 0, 5); 
glVertex3f(5, 0, 5); 
glVertex3f(5, 5, 5); 
glVertex3f(0, 5, 5); 

//|| to yz plane 
glColor3f(0.73, 0.58, 0.58); 
glVertex3f(0,0 ,5); 
glVertex3f(5, 0, 5); 
glVertex3f(5, 5, 5); 
glVertex3f(0, 5, 5); 

//|| to zx plane 
glVertex3f(0.58, 0, 0.82); 
glVertex3f(0, 5, 0 ); 
glVertex3f(0, 5, 5); 
glVertex3f(5, 5, 5); 
glVertex3f(5, 5, 0); 
glEnd(); 
glFlush(); 
} 


void reshape(int w,int h){ 

glViewport(0, 0, (GLsizei)w, (GLsizei)h); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(-1, 1, -1, 1, 1.5, 20); 
glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char** argv){ 

glutInit(&argc, argv);//we initizlilze the glut. functions 
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
glutInitWindowPosition(100, 100); 
glutCreateWindow(argv[0]); 
init(); 
glutDisplayFunc(DrawCube); 
glutReshapeFunc(reshape); 
glutMainLoop(); 
return 0; 
} 
+0

將'GL_POLYGON'替換爲'GL_QUADS'。 – ybungalobill 2010-09-27 22:51:31

+0

@Rahul,你爲什麼不接受其中一個答案? – jcoffland 2012-09-06 09:15:27

回答

3

問題是

glBegin(GL_POLYGON); 

這意味着所有以下頂點屬於相同,凸多邊形。

更改爲

glBegin(GL_QUADS); 

應該解決您的問題。

一般情況下,你不應該使用GL_POLYGON無論如何,因爲它通常是很慢。

+0

謝謝克里斯。我從一個小時就開始嘗試。有效。 :) – Rahul 2010-09-27 23:11:51

1

使用GL_QUADS,GL_POLYGON可以有未定義的行爲,如果所有的頂點不在同一平面上,如果我沒有記錯。此外,使用GL_SMOOTH繪製陰影模型,我認爲GL_FLAT再次使用第一種顏色,如果我沒有弄錯,它已經有一段時間了。

+0

你是對的,但是GL_FLAT應該沒有問題,因爲同一個四元組的所有頂點都具有相同的顏色。所以平面和平滑着色應該沒有區別。 – ChrisM 2010-09-27 22:54:26

+0

我認爲這是GL_FLAT + GL_POLYGON是第一個頂點的顏色用於整個幾何體的原因。 GL_POLYGON確保所有頂點屬於同一個「基元」,在這種情況下,它甚至不在同一個平面上,並且GL_FLAT確保第一個glColor用於所有頂點。如果你改變了任何參數,輸出看起來是正確的,但GL_POLYGON在這裏肯定是錯誤的,並且最好避免不惜一切代價。另外,具有GL_SMOOTH的輸出將根據GL_QUAD/GL_POLYGON將如何細分爲三角形而有所不同。 – Coder 2010-09-27 23:02:23