OpenGL超級寶典筆記——顏色

<h3>什麼是顏色</h3> <p>顏色只是某種波長的光。現實中咱們看到幾乎都是由許多不一樣類型的光組合而成的。波長是光波相鄰的波峯或相鄰的波谷之間的距離。</p> <p><a href="http://static.oschina.net/uploads/img/201309/26224830_sPUw.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224830_ChIK.png" width="564" height="142"></a></p> <p>人肉眼可見的光波的波長位於390nm(紫色光)到720nm(紅色光)之間。紫外線和紅外線都是人肉眼不可見的光。</p> <p><a href="http://static.oschina.net/uploads/img/201309/26224831_ZaSi.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224832_tn4W.png" width="557" height="161"></a></p> <p>事實上白色和黑色並非一種顏色。黑色是沒有顏色,由於可見光都被材料吸取了。而白色則是材料均勻的反射各類波長的光。</p> <p>光便是波也是粒子(波粒二象性)。人之因此看到顏色,是由於光子刺激視網膜上數以百萬計的錐細胞,致使神經能量傳遞到大腦中,大腦把把這種信息解釋爲光和顏色,光的亮度越大,撞擊錐細胞的光子就越多。物體會反射一些光子並吸取一些光子。人眼看到純藍色的物體,是由於該物體反射了藍色波長的光,吸取了其餘顏色其餘波長的光。若是人眼接受到的光的波長是均勻分佈的,至關於看到了白色。</p> <p><a href="http://static.oschina.net/uploads/img/201309/26224833_6Yi7.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224836_yIzE.png" width="546" height="307"></a></p> <h4>計算機如何產生顏色</h4> <p>計算機監視器在設計時就用來產生三種顏色的光,每種光的強度在一個可變的範圍內。計算機監視器(CRT)的後面,有一個電子槍在屏幕後面發射電子,屏幕上含有磷,當電子撞擊屏幕時,可以發射紅、綠、藍光。這三種顏色的磷緊密包裝在一塊兒做爲屏幕上的一個物理點(像素)。它所發射的光的強度因電子束的強度而異。</p> <p><a href="http://static.oschina.net/uploads/img/201309/26224837_Ikqx.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224838_Hogc.png" width="545" height="307"></a></p> <h3>在OpenGL中使用顏色</h3> <p>在OpenGL中咱們分別指定紅、綠、藍成分的強度來肯定一個顏色。</p> <h4>顏色立方體</h4> <p>因爲一種顏色是經過三個非負的顏色值指定的,咱們能夠對全部顏色進行建模,造成一個RGB顏色空間。顏色空間以紅、綠、藍爲軸,紅、綠、藍的座標就像x、y、z的座標。在座標(0,0,0)處就表明所紅、綠、藍顏色的強度都爲0,即黑色。在座標(255,255,255)紅、綠、藍顏色的強度達到最大值,爲白色。不一樣的灰色值,就分佈在(0,0,0)到(255,255,255)這條立方體的對角線上。</p> <p><a href="http://static.oschina.net/uploads/img/201309/26224839_Z3VJ.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224839_tbMJ.png" width="578" height="255"></a></p> <p><a href="http://static.oschina.net/uploads/img/201309/26224846_6tj6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224849_BnJG.png" width="345" height="361"></a></p> <h4>設置顏色</h4> <p>在OpenGL中設置顏色的函數原型以下:</p> <p>void glColor&lt;x&gt;&lt;t&gt;(red, green, blue, alpha);</p> <p>其中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之間。</p> <h4>着色</h4> <p>glColor函數設置了一個顏色值,以後的圖元都使用這個顏色值着色。若是咱們爲圖元的頂點指定了不一樣的顏色值,那麼這個圖元用什麼顏色來着色呢?</p> <p>若是圖元是點,那麼每一個點可使用其指定的顏色來着色。若是圖元是有兩個不一樣顏色的頂點指定的一條線,線的顏色要根據着色的模式來着色,若是是使用GL_FLAT模式,則使用最後一個頂點的顏色來着色。若是使用的是GL_SMOOTH平滑着色的模式,則進行平滑插值。在RGB顏色空間中的任意兩個點,都能連成一條直線。平滑着色便是使用這條線上的顏色來對圖元內的點進行填着色。不管你的多邊形有多複雜,OpenGL都可以正確地爲每一個點着色。OpenGL已經幫咱們實現了這種算法,咱們不須要關心。<a href="http://static.oschina.net/uploads/img/201309/26224850_VgxT.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224851_xCxz.png" width="581" height="391"></a></p> <p><a href="http://static.oschina.net/uploads/img/201309/26224852_63al.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224853_BUDf.png" width="585" height="321"></a></p> <p>示例:畫一個平滑着色的三角形</p> <div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode"><span class="kwrd">static</span> <span class="kwrd">void</span> RenderScene()<br>{<br> glClear(GL_COLOR_BUFFER_BIT);<br><br> glShadeModel(GL_SMOOTH);<br> <span class="rem">// Draw the triangle</span><br> glBegin(GL_TRIANGLES);<br> <span class="rem">// Red Apex</span><br> glColor3ub((GLubyte)255,(GLubyte)0,(GLubyte)0);<br> glVertex3f(0.0f,200.0f,0.0f);<br> <span class="rem">// Green on the right bottom corner</span><br> glColor3ub((GLubyte)0,(GLubyte)255,(GLubyte)0);<br> glVertex3f(200.0f,-70.0f,0.0f);<br> <span class="rem">// Blue on the left bottom corner</span><br> glColor3ub((GLubyte)0,(GLubyte)0,(GLubyte)255);<br> glVertex3f(-200.0f, -70.0f, 0.0f);<br> glEnd();<br><br> glutSwapBuffers();<br>}</pre><a href="http://static.oschina.net/uploads/img/201309/26224857_XOUu.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/26224859_xQxT.png" width="382" height="313"></a><br></div>算法

相關文章
相關標籤/搜索