本次學習的是顏色的選擇。終於要走出黑白的世界了~~
OpenGL支持兩種顏色模式:一種是RGBA,一種是顏色索引模式。
不管哪一種顏色模式,計算機都必須爲每個像素保存一些數據。不一樣的是,RGBA模式中,數據直接就表明了顏色;而顏色索引模式中,數據表明的是一個索引,要獲得真正的顏色,還必須去查索引表。
1. RGBA顏色
RGBA模式中,每個像素會保存如下數據:R值(紅色份量)、G值(綠色份量)、B值(藍色份量)和A值(alpha份量)。其中紅、綠、藍三種顏色相組合,就能夠獲得咱們所須要的各類顏色,而alpha不直接影響顏色,它將留待之後介紹。
在RGBA模式下選擇顏色是十分簡單的事情,只須要一個函數就能夠搞定。
glColor*系列函數能夠用於設置顏色,其中三個參數的版本能夠指定R、G、B的值,而A值採用默認;四個參數的版本能夠分別指定R、G、B、A的值。例如:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
(還記得嗎?3f表示有三個浮點參數~請看第二課中關於glVertex*函數的敘述。)
將浮點數做爲參數,其中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); 表示各類顏色使用一半,效果爲灰色。
注意:浮點數能夠精確到小數點後若干位,這並不表示計算機就能夠顯示如此多種顏色。實際上,計算機能夠顯示的顏色種數將由硬件決定。若是OpenGL找不到精確的顏色,會進行相似「四捨五入」的處理。
你們能夠經過改變下面代碼中glColor3f的參數值,繪製不一樣顏色的矩形。編程
1 void myDisplay(void) 2 { 3 glClear(GL_COLOR_BUFFER_BIT); 4 glColor3f(0.0f, 1.0f, 1.0f); 5 glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 6 glFlush(); 7 }
效果:windows
注意:glColor系列函數,在參數類型不一樣時,表示「最大」顏色的值也不一樣。
採用f和d作後綴的函數,以1.0表示最大的使用。
採用b作後綴的函數,以127表示最大的使用。
採用ub作後綴的函數,以255表示最大的使用。
採用s作後綴的函數,以32767表示最大的使用。
採用us作後綴的函數,以65535表示最大的使用。
這些規則看似麻煩,但熟悉後實際使用中不會有什麼障礙。
二、索引顏色
在索引顏色模式中,OpenGL須要一個顏色表。這個表就至關於畫家的調色板:雖然能夠調出不少種顏色,但同時存在於調色板上的顏色種數將不會超過調色板的格數。試將顏色表的每一項想象成調色板上的一個格子:它保存了一種顏色。
在使用索引顏色模式畫圖時,我說「我把第i種顏色設置爲某某」,其實就至關於將調色板的第i格調爲某某顏色。「我須要第k種顏色來畫圖」,那麼就用畫筆去蘸一下第k格調色板。
顏色表的大小是頗有限的,通常在256~4096之間,且老是2的整數次冪。在使用索引顏色方式進行繪圖時,老是先設置顏色表,而後選擇顏色。
2.一、選擇顏色
使用glIndex*系列函數能夠在顏色表中選擇顏色。其中最經常使用的多是glIndexi,它的參數是一個整形。
void glIndexi(GLint c);
是的,這的確很簡單。
2.二、設置顏色表
OpenGL 並直接沒有提供設置顏色表的方法,所以設置顏色表須要使用操做系統的支持。咱們所用的Windows和其餘大多數圖形操做系統都具備這個功能,但所使用的 函數卻不相同。正如我沒有講述如何本身寫代碼在Windows下創建一個窗口,這裏我也不會講述如何在Windows下設置顏色表。
GLUT工具 包提供了設置顏色表的函數glutSetColor,但我測試始終有問題。如今爲了讓你們體驗一下索引顏色,我向你們介紹另外一個OpenGL工具包: aux。這個工具包是VisualStudio自帶的,沒必要另外安裝,但它已通過時,這裏僅僅是體驗一下,你們沒必要深刻。函數
1 #include <windows.h> 2 #include <GL/glut.h> 3 #include <GL/glaux.h> 4 5 #pragma comment (lib, "opengl32.lib") 6 #pragma comment (lib, "glaux.lib") 7 8 #include <math.h> 9 const GLdouble Pi = 3.1415926536; 10 void myDisplay(void) 11 { 12 int i; 13 for(i=0; i<8; ++i) 14 auxSetOneColor(i, (float)(i&0x04), (float)(i&0x02), (float)(i&0x01)); 15 glShadeModel(GL_FLAT); 16 glClear(GL_COLOR_BUFFER_BIT); 17 glBegin(GL_TRIANGLE_FAN); 18 glVertex2f(0.0f, 0.0f); 19 for(i=0; i<=8; ++i) 20 { 21 glIndexi(i); 22 glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); 23 } 24 glEnd(); 25 glFlush(); 26 } 27 28 int main(void) 29 { 30 auxInitDisplayMode(AUX_SINGLE|AUX_INDEX); 31 auxInitPosition(0, 0, 400, 400); 32 auxInitWindow(L""); 33 myDisplay(); 34 Sleep(10 * 1000); 35 return 0; 36 }
效果:工具
其它部分你們均可以無論,只看myDisplay函數就能夠了。首先,使用auxSetOneColor設置顏色表中的一格。循環八次就能夠設置八格。
glShadeModel等下再講,這裏不提。
而後在循環中用glVertex設置頂點,同時用glIndexi改變頂點表明的顏色。
最終獲得的效果是八個相同形狀、不一樣顏色的三角形。
索 引顏色雖然講得多了點。索引顏色的主要優點是佔用空間小(每一個像素沒必要單獨保存本身的顏色,只用不多的二進制位就能夠表明其顏色在顏色表中的位置),花費 系統資源少,圖形運算速度快,但它編程稍稍顯得不是那麼方便,而且畫面效果也會比RGB顏色差一些。「星際爭霸」可能表明了256色的顏色表的畫面效果, 雖然它在一臺很爛的PC上也能夠運行很流暢,但以目前的眼光來看,其畫面效果就顯得不足了。
目前的PC機性能已經足夠在各類場合下使用RGB顏色,所以PC程序開發中,使用索引顏色已經不是主流。固然,一些小型設備例如GBA、手機等,索引顏色仍是有它的用武之地。
三、指定清除屏幕用的顏色
咱們寫:glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的顏色清空。
但實際上什麼才叫「空」呢?在宇宙中,黑色表明了「空」;在一張白紙上,白色表明了「空」;在信封上,信封的顏色纔是「空」。
OpenGL用下面的函數來定義清楚屏幕後屏幕所擁有的顏色。
在RGB模式下,使用glClearColor來指定「空」的顏色,它須要四個參數,其參數的意義跟glColor4f類似。
在索引顏色模式下,使用glClearIndex來指定「空」的顏色所在的索引,它須要一個參數,其意義跟glIndexi類似。性能
1 void myDisplay(void) 2 { 3 glClearColor(1.0f, 0.0f, 0.0f, 0.0f); 4 glClear(GL_COLOR_BUFFER_BIT); 5 glFlush(); 6 }
效果:學習
呵,這個還真簡單~
四、指定着色模型
OpenGL容許爲同一多邊形的不一樣頂點指定不一樣的顏色。例如:測試
1 #include <math.h> 2 const GLdouble Pi = 3.1415926536; 3 void myDisplay(void) 4 { 5 int i; 6 // glShadeModel(GL_FLAT); 7 glClear(GL_COLOR_BUFFER_BIT); 8 glBegin(GL_TRIANGLE_FAN); 9 glColor3f(1.0f, 1.0f, 1.0f); 10 glVertex2f(0.0f, 0.0f); 11 for(i=0; i<=8; ++i) 12 { 13 glColor3f(i&0x04, i&0x02, i&0x01); 14 glVertex2f(cos(i*Pi/4), sin(i*Pi/4)); 15 } 16 glEnd(); 17 glFlush(); 18 }
效果:spa
在 默認狀況下,OpenGL會計算兩點頂點之間的其它點,併爲它們填上「合適」的顏色,使相鄰的點的顏色值都比較接近。若是使用的是RGB模式,看起來就具 有漸變的效果。若是是使用顏色索引模式,則其相鄰點的索引值是接近的,若是將顏色表中接近的項設置成接近的顏色,則看起來也是漸變的效果。但若是顏色表中 接近的項顏色卻差距很大,則看起來多是很奇怪的效果。
使用glShadeModel函數能夠關閉這種計算,若是頂點的顏色不一樣,則將頂點之間的其它點所有設置爲與某一個點相同。(直線之後指定的點的顏色爲準,而多邊形將以任意頂點的顏色爲準,由實現決定。)爲了不這個不肯定性,儘可能在多邊形中使用同一種顏色。
glShadeModel的使用方法:
glShadeModel(GL_SMOOTH); // 平滑方式,這也是默認方式
glShadeModel(GL_FLAT); // 單色方式操作系統
對於上面的代碼運用帶色模式效果以下:code
小結:
本課學習瞭如何設置顏色。其中RGB顏色方式是目前PC機上的經常使用方式。
能夠設置glClear清除後屏幕所剩的顏色。
能夠設置顏色填充方式:平滑方式或單色方式。
===================== 第四課 完 =====================
=====================TO BE CONTINUED=====================