<h3>現實中的顏色</h3> <p>以下圖:咱們爲物體構造好了模型,也爲每一個平面設置了顏色值,但最終畫出來的物體卻一點都不像真實世界中的物體。在真實世界中物體的表面最終呈現的顏色還取決於你觀察它的角度以及光源。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203355_RzUl.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/29203355_IqGZ.png" width="212" height="244"></a></p> <p>OpenGL提供了近似於真實世界的光照環境。在OpenGl中物體會被三種光照射:環境光,漫放射光,鏡面光。經過調整這三種光源的屬性,咱們可使得物體看起來更真實。</p> <h4>環境光</h4> <p>環境光沒有特定的方向。環境光的光線充滿着整個場景。場景中的物體都被環境光從各個方向照射着。環境光的特色是:照射在物體上的光來自周圍各個方向,又均勻地向各個方向反射。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203355_RH7L.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/29203356_Qc4U.png" width="589" height="245"></a></p> <h4>漫反射光</h4> <p>漫放射光是一組來自特定方向,具備方向性的光。根據入射光線的角度在表面上均勻地向各個方向反射。漫反射的特色是:光源來自一個方向,反射光均勻地射向各個方向。漫反射光采用點光源照射物體。點光源是位於空間某個位置的一個點,向周圍全部的方向上輻射等光強的光。在點光源的照射下,物體表面的不一樣部分亮度不一樣,亮度的大小依賴於它的朝向以及它與點光源之間的距離。</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203356_09eI.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/29203356_oQLz.png" width="594" height="206"></a></p> <h4>鏡面光</h4> <p>鏡面光與漫反射光同樣是具備方向性的。高強度的鏡面光會在被照射的物體的表面上造成亮點。對於理想的高光澤度反射面,反射角等於入射角時,光線纔會被反射,即只有在等於入射角的反射角方向上,觀察者才能看到反射光。對於這種理想的反射面,鏡面反射的光強要比環境光和漫反射的光強高出不少倍,這時,若是觀察者正好處在P點的鏡面反射方向上,就會看到一個比周圍亮得多的高光點。</p> <p> </p> <p><a href="http://static.oschina.net/uploads/img/201309/29203358_gsbO.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/29203358_UYeZ.png" width="580" height="261"></a></p> <h4>綜合影響</h4> <p>事實上,光源是由各類強度不一樣的類型的光組成的。場景中的光源是由3種光組成的:環境光,漫反射光,鏡面光。每種光的成分也像顏色同樣是由RGBA值定義的。它描述了組成這種成分的紅光,綠光,藍光的強度(對於光的顏色而言,alpha值被忽略)。</p> <p>紅色射線的光源成分分佈:</p> <p><a href="http://static.oschina.net/uploads/img/201309/29203401_taL7.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/29203401_j9Ds.png" width="588" height="126"></a></p> <p>紅色射線不包含綠光和藍光成分。這些光源成分的強度取值範圍在0.0到1.0之間。上面的表格說明了紅色射線包含很是高的鏡面光的成分,一點漫放射光成分,和很是少的環境光成分。(注:鏡面光的強度要大於其餘成分纔可能產生亮點).在被紅色光照射的地方你可能(取決於觀察點是否在光反射的方向上)會看到一個很亮的紅點。</p> <h3>現實世界的材料</h3> <p>材料的顏色是根據它所放射的光的波長來定義的。一個藍色的球體反射了絕大部分的藍色光子且吸取了其餘顏色的光子。在現實世界中白光包含了全部顏色的光,因此咱們可以看到材料它自己的顏色。若是藍色的球體在單純的紅光照射下,咱們看到的將是黑色的。</p> <h4>材料的屬性</h4> <p>當咱們使用光照時,咱們是經過材料的反射屬性來描述它的顏色的。咱們會說一個多邊形反射了絕大多數的紅光,而不會說這個多邊形是紅色的。咱們爲三種光源:環境光,漫放射光,鏡面光,指定材料相應的反射屬性。一個材料可能會很好的反射鏡面光,卻吸取了大多數的漫放射光和環境光。</p> <h4>給材料添加光照</h4> <p>物體有它本身反射的顏色,光源也有它本身的顏色。OpenGL是如何決定使用哪一種顏色的?</p> <h4>環境光的效果</h4> <p>若光源顏色爲( LR , LG , LB ),材質顏色爲( MR , MG , MB ),最終顏色爲( LR*MR , LG*MG , LB*MB )。(B1+B2)*MB )。所以,材料的顏色成分決定了入射光被反射的百分比。例子:</p> <p>光源顏色爲(0.5, 0.5, 0.5), 材料的顏色爲(0.5, 1.0, 0.5)那麼最終的顏色是</p> <p>(0.5*0.5, 0.5*1.0, 0.5*0.5) = (0.25, 0.5, 0.25) 。</p> <p>公式</p> <p><em>ambient</em> = <em>K<sub>a</sub></em> x <em>globalAmbient</em></p> <p><a href="http://static.oschina.net/uploads/img/201309/29203401_nKrz.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/29203401_tzTi.png" width="593" height="213"></a></p> <h4>漫反射光與鏡面光的效果</h4> <p>漫反射光具備方向性,並且照射在物體表面上光的強度與光源和表面的夾角、光源和表面的距離以及相關的衰減因素有關(在光源和物體之間是否有霧)。</p> <p>反射光的計算一般用Lambert定律: <p>Ildiff = Kd * Il * Cos(θ)<br>其中Il是點光源強度,θ是入射光方向與頂點法線的夾角,稱入射角(0<=A<=90°),Ildiff是漫反射體與方向光交互反射的光強,若 N爲頂點單位法向量,L表示從頂點指向光源的單位向量(注意頂點指向光源),則Cos(θ)等價於dot(N,L),故又有:<br>Ildiff = Kd * Il * dot(N,L) <ul></ul> <p>鏡面光的計算方法比較複雜。最經常使用的計算方法是:先經過光線的方向向量和物體的平面法向量來計算出光線的反射方向向量。而後再用光線的反射方向向量和視線的方向向量作點積來計算出光線對眼睛的做用強度。再把這個計算獲得的做用強度以光澤度值做乘方運算來增長高光部分的匯聚性,減小擴散。最後再把計算結果乘上光線自己的顏色。</p> <p>馮氏模型公式以下:</p> <p>spec = Ks * Il * ( dot(V,R) )^Ns<br>其中Ks 爲鏡面反射係數,Ns是高光指數,V表示從頂點到視點的觀察方向,R表明反射光方向。因爲反射光的方向R能夠經過入射光方向L(從頂點指向光源)和物體的法向量求出,<br>R + L = 2 * dot(N, L) * N 即 R = 2 * dot(N,L) * N - L<br>因此最終的計算式爲:<br>Ispec = Ks * Il * ( dot(V, (2 * dot(N,L) * N – L ) )^Ns <p> <ul></ul> <p>參考 <a href="http://cs.hust.edu.cn/webroot/courses/csgraphics/jiaocai.php?bookpage=10_a">華科計算機圖形學</a></p> <p> <a href="http://www.cnblogs.com/heww/articles/1666392.html">http://www.cnblogs.com/heww/articles/1666392.html</a></p> <p><a href="http://www.web-tinker.com/article/20168.html">http://www.web-tinker.com/article/20168.html</a></p>php