與教程一相比,只需要在render函數中添加設置顏色的語句:void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void?Lesson2::render() { ????glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ????glViewport(0,0,(GLint)width(),(GLint)height());?//?重置當前視口 ????glMatrixMode(GL_PROJECTION);????????????????????//?選擇投影矩陣 ????glLoadIdentity();???????????????????????????????//?重置投影矩陣為單位矩陣 ????//?glu庫函數Qt不支持,但是glu庫函數是對gl庫函數的封裝,方便使用。因此我們可以自己 ????//?寫一個類似gluPerspective的函數myPerspective,用于設置透視。 ????//gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); ????myPerspective(45.0,(GLfloat)width()/(GLfloat)height(),0.1,100.0); ????glMatrixMode(GL_MODELVIEW);//?選擇模型視圖矩陣 ????glLoadIdentity();??????????//?重置模型視圖矩陣為單位矩陣 ????glTranslatef(-1.5f,0.0f,-6.0f);?//?左移1.5單位,并移入屏幕6.0 ????glBegin(GL_TRIANGLES); //?繪制三角形 ????glColor3f(1.0f,0.0f,0.0f); //?設置當前色為紅色 ????glVertex3f(?0.0f,?1.0f,?0.0f); //?上頂點 ????glColor3f(0.0f,1.0f,0.0f); //?設置當前色為綠色 ????glVertex3f(-1.0f,-1.0f,?0.0f); //?左下 ????glColor3f(0.0f,0.0f,1.0f); //?設置當前色為藍色 ????glVertex3f(?1.0f,-1.0f,?0.0f); //?右下 ????glEnd();????????????????????????//?三角形繪制結束 ????glTranslatef(3.0f,0.0f,0.0f);???//?在左移1.5單位的基礎上右移3.0單位,相當于右移了1.5單位,z坐標值沿用前面的6.0 ????glColor3f(0.5f,0.5f,1.0f); ????//?一次性將當前色設置為紫色 ????glBegin(GL_QUADS); //?繪制正方形 ????glVertex3f(-1.0f,?1.0f,?0.0f); //?左上 ????glVertex3f(?1.0f,?1.0f,?0.0f); //?右上 ????glVertex3f(?1.0f,-1.0f,?0.0f); //?左下 ????glVertex3f(-1.0f,-1.0f,?0.0f); //?右下 ????glEnd(); ????//?正方形繪制結束 }
運行效果
三角形之所以是彩色的,是因為initialize函數里將作色模式設置為了平滑作色:glShadeModel(GL_SMOOTH); ?
void?Lesson2::initialize() { ????glShadeModel(GL_SMOOTH);??????????????//?啟用平滑著色 ????glClearColor(0.0f,?0.0f,?0.0f,?0.0f);?//?黑色背景 ????glClearDepth(1.0f);???????????????????//?設置深度緩存 ????glEnable(GL_DEPTH_TEST);??????????????//?啟用深度測試 ????glDepthFunc(GL_LEQUAL);???????????????//?深度測試類型 ????//?接著告訴OpenGL我們希望進行最好的透視修正。這會十分輕微的影響性能。但使得透視圖看起來好一點。 ????glHint(GL_PERSPECTIVE_CORRECTION_HINT,?GL_NICEST); }
如果將作色模式設置為glShadeModel(GL_FLAT); 三角形就變成了藍色,即三角形最后一個頂點的顏色。
源碼中用到的OpenGL庫函數可以參考:
OpenGL之glShadeModel函數的用法