顏色只是某種波長的光。現實中我們看到幾乎都是由許多不同類型的光組合而成的。波長是光波相鄰的波峰或相鄰的波谷之間的距離。
人肉眼可見的光波的波長位於390nm(紫色光)到720nm(紅色光)之間。紫外線和紅外線都是人肉眼不可見的光。
事實上白色和黑色並不是一種顏色。黑色是沒有顏色,因為可見光都被材料吸收了。而白色則是材料均勻的反射各種波長的光。
光即是波也是粒子(波粒二象性)。人之所以看到顏色,是因為光子刺激視網膜上數以百萬計的錐細胞,導致神經能量傳遞到大腦中,大腦把把這種信息解釋為光和顏色,光的亮度越大,撞擊錐細胞的光子就越多。物體會反射一些光子並吸收一些光子。人眼看到純藍色的物體,是因為該物體反射了藍色波長的光,吸收了其他顏色其他波長的光。如果人眼接受到的光的波長是均勻分布的,相當於看到了白色。
計算機監視器在設計時就用來產生三種顏色的光,每種光的強度在一個可變的范圍內。計算機監視器(CRT)的後面,有一個電子槍在屏幕後面發射電子,屏幕上含有磷,當電子撞擊屏幕時,能夠發射紅、綠、藍光。這三種顏色的磷緊密包裝在一起作為屏幕上的一個物理點(像素)。它所發射的光的強度因電子束的強度而異。
在OpenGL中我們分別指定紅、綠、藍成分的強度來確定一個顏色。
由於一種顏色是通過三個非負的顏色值指定的,我們可以對所有顏色進行建模,形成一個RGB顏色空間。顏色空間以紅、綠、藍為軸,紅、綠、藍的坐標就像x、y、z的坐標。在坐標(0,0,0)處就代表所紅、綠、藍顏色的強度都為0,即黑色。在坐標(255,255,255)紅、綠、藍顏色的強度達到最大值,為白色。不同的灰色值,就分布在(0,0,0)到(255,255,255)這條立方體的對角線上。
在OpenGL中設置顏色的函數原型如下:
void glColor (red, green, blue, alpha);
其中x代表參數個數,可以是3個值代表rgb顏色,或者使4個值分別代表rgba。alpha成分用來代表透明度。t代表參數的類型,可以是b,d,f,i,s,ub,ui,us對應的類型是byte,double,float,integer,short,unsigned byte, unsigned integer,unsigned short。glColor3f指定各個顏色成分的強度值的范圍為0.0到1.0之間。glColor3ub則可以指定各個顏色成分的強度值的范圍在0-255之間。
glColor函數設置了一個顏色值,之後的圖元都使用這個顏色值著色。如果我們為圖元的頂點指定了不同的顏色值,那麼這個圖元用什麼顏色來著色呢?
如果圖元是點,那麼每個點可以使用其指定的顏色來著色。如果圖元是有兩個不同顏色的頂點指定的一條線,線的顏色要根據著色的模式來著色,如果是使用GL_FLAT模式,則使用最後一個頂點的顏色來著色。如果使用的是GL_SMOOTH平滑著色的模式,則進行平滑插值。在RGB顏色空間中的任意兩個點,都能連成一條直線。平滑著色即是使用這條線上的顏色來對圖元內的點進行填著色。無論你的多邊形有多復雜,OpenGL都能夠正確地為每個點著色。OpenGL已經幫我們實現了這種算法,我們不需要關心。
示例:畫一個平滑著色的三角形
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
// Draw the triangle
glBegin(GL_TRIANGLES);
// Red Apex
glColor3ub((GLubyte)255,(GLubyte)0,(GLubyte)0);
glVertex3f(0.0f,200.0f,0.0f);
// Green on the right bottom corner
glColor3ub((GLubyte)0,(GLubyte)255,(GLubyte)0);
glVertex3f(200.0f,-70.0f,0.0f);
// Blue on the left bottom corner
glColor3ub((GLubyte)0,(GLubyte)0,(GLubyte)255);
glVertex3f(-200.0f, -70.0f, 0.0f);
glEnd();
glutSwapBuffers();
}
OpenGL超級寶典 第4版 中文版PDF+英文版+源代碼 見 http://www.linuxidc.com/Linux/2013-10/91413.htm
OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm
OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm
Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm
OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm
Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm
如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm
更多《OpenGL超級寶典學習筆記》相關知識 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=34581