您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關unity3d中圖形學的光照原理是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先,在物理學里我們知道,物體的顏色其實是它反射的光的顏色。光是白色的,但它的白色是由許許多多不同顏色不同頻率的光混在一起呈現的,也就是光譜(spectrum)。紅色的物體反射紅光比較多,藍光和綠光則被吸收。白色的衣服反射白光,黑色的衣服吸收白光,這也是為什么夏天穿白衣服會稍微稍微涼快一點的原因。
而我們要實現光照,就要去模擬物體的反射光,讓物體有明暗關系,有亮面有暗面。物體的反射光可以簡單分為3種:
1. 漫反射(Diffuse)
當光照射到物體上面,物體會反射自身的顏色,這是最基本的反射,會根據光照方向產生明暗關系(明暗關系是有的地方亮有的地方暗,不是影子,影子是其他物體投射到你身上,你身上才有暗色的影子,本文不考慮投射影子。因為一個物體,比如正方體,不會自己讓自己產生影子,只有在它前面放個球,球的影子才會映到正方體上),反射方向完美情況下是向四面八方,這也就是“漫”的由來。
我們取單獨一個切面進行分析
N是物體的法線,L是入射光的方向向量,le是入射光的顏色,則反射光的顏色強度lj滿足:
lj = le Kd cos(θ) 或者 lj = le Kd (L·N)
其中,Kd是物體本身的顏色,比如橘子就是橙色。
這個公式理解起來就是:你反射的顏色,是你本來的顏色和照射你的光的顏色的混合。
比如你穿了個白衣服但紅光照你,那反射的就是偏紅色。你的顏色和光的顏色的混合比例通過θ來確定,當θ為0,即光正對著使勁照你,那你就是很亮的紅色了,當光正好和你平行擦著你過去,那你就沒顏色了,黑色的。光對你越正,你就越亮,否則越暗。
注意: 本文所有的公式的光照方向向量和法線都必須是標準化了的。顏色向量的RGB范圍都是0~12. 高光(Specular)
這個是可有可無的。
高光就是指光滑的物體會有一小部分特別亮的地方,趨近于鏡面反射。
上圖的小球,中間那塊圓形白色就是高光。同一個小球,左上偏亮右下偏暗,這樣的明暗關系是漫反射。
高光顏色強度公式為:
V是視角向量,因為高光和視角有關系,當你繞著一個光滑球走時,你會發現它的高光鏡面反射的部位也會改變。 Ks就是物體鏡面反射的顏色,一般是白色,當然如果很魔幻你想讓物體高光發藍色也可以。 R是反射光的方向向量,就是L入射光關于法線N的對稱向量。spec就是反射強度,看上圖那3個小球。
這個公式的理解就是:鏡面反射(高光)的顏色是入射光的顏色和鏡面反射光的顏色的疊加。鏡面反射光的強度取決于視角以及spec。
當V和R平行時,即反射的光直射你的眼睛,會亮到爆炸。到V和R垂直時,光照全都照不進你的眼,就沒有鏡面反射,沒有高光。3. 環境光(Ambient Light)
假設場景里就一個球和一個光源,那么按照目前的公式算出來,有光的地方有顏色,亮。沒光的地方一片漆黑。
但有人覺得一片漆黑不太好,應該也能看見點東西,所以就加了一個環境光,讓整體再亮一點,從而使暗部呈現一些顏色。
環境光顏色計算公式為:
lj = la Ka
la是環境光的顏色,Ka是物體的環境光系數,一般而言Ka = Kd = 物體本身的顏色,只有高光的Ks不是物體本身的顏色,而是偏白色。
光照計算公式
綜上,一個物體在光照下擁有明暗關系之后的顏色公式如下:
就是所有光源的高光計算結果+所有光源的漫反射計算結果+環境光顏色
場景中的環境光只有一個,而發光光源可能有好幾個,所以高光和漫反射每個光源都要算,然后加起來。
這個公式的加標示版本:
其中,E是視角向量,就是V。
注意:
我們算光照的時候是在相機坐標系空間下計算的,即image space(不懂空間變換的參考我的坐標系空間變換)。所以E(視角向量)永遠都是(0,0,-1),因為我們往正前方看就是往Z=1的地方看,它的反向量就是 -1。
為什么是相機空間?
因為光照計算涉及方向向量L, E, N, R,我們需要在仿射空間(affine space,即pre-perspective space, 包括model, world, image 3個space)進行變換,因為從image變換到perspective空間會扭曲圖形損失信息。model, world, image 3個空間計算光照都行,本文選image。
在image空間下,法線等方向向量都要變換到image space,但要注意的是,法線的變換是只有旋轉,沒有位移和縮放的!!!因為法線如果位移,即在法線向量上加一個位移向量,兩個向量如果不平行,那么和向量的方向會和原法線不一致!
當E和L不在一邊的時候,即我們在看物體正面,光從物體背面照過來,我們是什么都看不見的,是黑色,這種情況就不計算,直接跳過。當E和L在同一邊,但法線N在另一邊的時候,算出來也是負的,不行,所以要把法線取個反再算。總之就是保證最后的顏色RGB在0~1范圍內。
我們知道三角形三個頂點的光照顏色了,但屏幕像素中,落在三角形內部的點的顏色怎么辦?
答:插值。在光柵化里我們計算過平面方程用于三角形內部點的Z插值。那么其他的插值都可以按這個方法來。
根據插值方式的不同,shade又分為兩大類:
1. Gouraud Shading
三角形內部點的顏色根據三個頂點的顏色插值得來,不用管內部像素點的法線啊光照啊啥的,所以方便運算,快。但精度差了點。比如光源正好位于三角形的正中央,那么3個頂點的顏色因為離光源遠,所以會比較暗,那么中間點的顏色插值出來也會暗。但實際上中間點離光源近,應該更亮才對!
上圖為顏色插值方法,即構造3維平面方程,把Z分別替換為R, G, B構造3個平面,然后帶入像素點的x,y,求出3個Z(即R, G, B)。
2. Phong Shading
為了解決Gouraud的精度問題,我們可以在內部像素每個像素點都重新算一遍光照顏色。所以我們需要計算出內部像素點的法線N,通過插值算。然后帶入上面說的光照方程算出該點的顏色。這樣是最準確的,但是計算量稍微大一點。目前的主流引擎基本都是默認的Phong。
法線插值就構造3個平面方程,把Z分別換成法線N的x, y, z。
帶入像素點的x,y,求出Nx, Ny, Nz,就得到了該點的N。
關于“unity3d中圖形學的光照原理是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。