尊重他人智慧成果,歡迎轉載,請注明作者 心若透明,原文地址 http://www.cnblogs.com/ubanck/p/4105941.html
在游戲開發過程中,光照應該是必不可少部分,當然,這是指大多數的稍微大型一些的3D游戲會需要,給模型或者山山水水加上光照,會看上去更加的真實,獲得更好的體驗。一個本身不發光物體顯示什么顏色,在於本身反射什么顏色,比如一塊石頭,在太陽光的照射之后,你看到是紅色的,而太陽光是白色的,白色是因為RGB組合而成,這快石頭吸收了綠色和藍色,反射了紅色,那么你看到這塊石頭就會是紅色的!
那么談到反射,就分為了漫反射(diffuse)和鏡面反射(specular),先說漫反射
因為表面凹凸不平,所有法線的方向也就不一致,那么反射的光線也就不一致,何為法線,所謂法線,就是垂直與表面的那條線(看到一個哥們兒說因為法線一定是垂直的線,像個公正不阿的法官,所以叫法線),入射光線到表面,令入射光線與反射光線的夾角相等,得到反射光線,而我們在計算中是試用dot(N,L)來得到一個值,N代表法線向量,L代表入射光線的向量表示,先對這兩個向量進行歸一化處理(使用normalize函數)所謂的歸一化處理,即是讓這個向量的模等於1(其實就是讓向量除以他的模,這塊可以參考3D圖形學基礎里面提到的向量部分),而dot函數的公式為向量點乘,即N*L=|N|*|L|cosΘ 由於之前對N與L進行了歸一化處理,那么N*L=cosΘ,回顧一下三角函數,也就是說,入射光線與法線夾角在(0,90)之間,角度越大,那么值就越小。
下面給出漫反射的公式:diffuse = Kd * lightColor * max(N·L,0)。
首先kd為光強,也就是光照的強度,准確的說是材質對光的反射系數,在0到1 之間,根據名稱可以自己想象一下。其次lightColor,這玩意兒是指光的顏色,它里面有rgb三個分量,用句牛逼的話說,世界上所有的顏色都可以用RGB來表示,通過在計算機中RGB三個不同的值可以匹配出無數種顏色,8bit的顏色通道可以表示出0-255,那么256的3次方,就可以組合得到16777216種顏色,當然,人的眼睛貌似感覺不到那么多顏色,扯遠了,回到剛剛那個話題,光的顏色有了,在乘以max(N*L,0),為什么要這樣做?因為如果夾角大於90度,那么就會出現負數,負數是沒有意義的(至於為什么會出現大於90度的情況,請發揮空間想象能力(腦補)),這樣就得到了漫反射的顏色值了!!!
(就是簡單是梳理一下思路!漫反射的代碼,待會兒上傳一下,作為總結)