從本節開始,將敘述如何設定圖形的外觀屬性如大小和顏色、線型、線寬等。
1、點的大小
glPointSize函數用於設定單個點的大小,函數原型為:
void glPointSize(GLfloat size);
參數size的值必須大於0.0f,預設值為1.0f,單位為“像素”。
注意:對於具體的OpenGL實現,點的大小都有個限度的,如果設定的size超過最大值,則設定可能會有問題。
下面的代碼在螢幕上標出了兩個點,每個點的半徑都是5像素。
void display(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(0.0f, 0.0f);glVertex2f(0.5f, 0.5f);glEnd();glFlush();}
運行效果如所示
OpenGL支援兩種顏色模式:,一種是RGBA模式,一種是索引模式。由於索引模式在PC機上已經用不到,所以不講。
2、設定前景色彩。
設定像素的RGBA值的函數名字是glColor* 。
函數原型為:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
(還記得嗎?函數名裡的3f 表示有三個浮點參數~請看第二課中關於glVertex*函數的敘述。)
這裡的A是alpha通道的縮寫。alphat通道的作用是設定不透明度,預設值是1。實際上,下面兩句代碼的功能是等效的
glColor3f(1.0,0.0,0.0);glColor4f(1.0,0.0,0.0,1.0);
例如:
glColor3f(1.0f, 0.0f, 0.0f); //紅色。glColor3f(0.0f, 1.0f, 1.0f); //淺藍色。glColor3f(0.5f, 0.5f, 0.5f); //灰色。
下面代碼繪製了一個淺藍色的矩形。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 1.0f);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
運行效果如:
注意:浮點數可以精確到小數點後若干位,這並不表示電腦就可以顯示如此多種顏色。實際上,電腦可以顯示的顏色種數將由硬體決定。如果OpenGL找不到精確的顏色,會進行類似“四捨五入”的處理。
3、設定背景色
opengl提供了一個函數glClearColor來設定螢幕的背景色。這個函數需要和另外一個函數glClear結合起來使用。例子代碼如下:
void display(void){ glClearColor(1.0f, 0.0f, 0.0f, 0.0f); //設定背景色為紅色 glClear(GL_COLOR_BUFFER_BIT);//清空螢幕,也就是用背景色將整個表單的繪圖區重新畫一遍 glFlush();}
運行效果就是畫出了一個繪圖區為紅色的表單,如所示
4、線段的顏色。
從前面可知,glColor函數設定了下一次繪圖操作時所使用的畫筆顏色,如下面的例子代碼。標出了兩個點,原點A(0,0)的顏色為紅色,而點B(0.5,0.5)的顏色為綠色。
void display(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0); //使用中色彩為紅色glVertex2f(0.0f, 0.0f); glColor3f(0.0,1.0,0.0); //使用中色彩為綠色glVertex2f(0.5f, 0.5f);glEnd();glFlush();}
運行效果為:
將上面代碼中的繪圖模式從GL_POINTS改為GL_LINES,可以得到一條線段AB。細心的讀者於是要問:線段AB上的每個點的顏色應該是什嗎?都是紅色?都是綠色?
一半紅色?一半綠色?關於這個問題,我麼先看下運行結果。
可以看到,線段AB上各點的顏色是"漸層"的,也就是逐漸從紅色變為綠色。
opengl中提供了一個函數glShadeModel來決定如果處理這種不同顏色的情況。
這個函數的參數值只有兩個:如下所示
glShadeModel(GL_SMOOTH); // 平滑方式,這也是opengl的預設處理方式,實現色彩坡形的效果glShadeModel(GL_FLAT); // 單色方式,線段的顏色以某一個頂點的顏色為準,由具體實現決定。為了避免不確定性,應盡量在多邊形中使用同一種顏色