溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

unity3d中圖形學(xué)的光照原理是什么

發(fā)布時間:2022-01-19 09:37:21 來源:億速云 閱讀:243 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)unity3d中圖形學(xué)的光照原理是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先,在物理學(xué)里我們知道,物體的顏色其實是它反射的光的顏色。光是白色的,但它的白色是由許許多多不同顏色不同頻率的光混在一起呈現(xiàn)的,也就是光譜(spectrum)。紅色的物體反射紅光比較多,藍(lán)光和綠光則被吸收。白色的衣服反射白光,黑色的衣服吸收白光,這也是為什么夏天穿白衣服會稍微稍微涼快一點的原因。

而我們要實現(xiàn)光照,就要去模擬物體的反射光,讓物體有明暗關(guān)系,有亮面有暗面。物體的反射光可以簡單分為3種:

1. 漫反射(Diffuse)
當(dāng)光照射到物體上面,物體會反射自身的顏色,這是最基本的反射,會根據(jù)光照方向產(chǎn)生明暗關(guān)系(明暗關(guān)系是有的地方亮有的地方暗,不是影子,影子是其他物體投射到你身上,你身上才有暗色的影子,本文不考慮投射影子。因為一個物體,比如正方體,不會自己讓自己產(chǎn)生影子,只有在它前面放個球,球的影子才會映到正方體上),反射方向完美情況下是向四面八方,這也就是“漫”的由來。

unity3d中圖形學(xué)的光照原理是什么

我們?nèi)为氁粋€切面進(jìn)行分析

unity3d中圖形學(xué)的光照原理是什么

N是物體的法線,L是入射光的方向向量,le是入射光的顏色,則反射光的顏色強(qiáng)度lj滿足:
lj = le Kd cos(θ) 或者 lj = le Kd (L·N)
其中,Kd是物體本身的顏色,比如橘子就是橙色。
這個公式理解起來就是:你反射的顏色,是你本來的顏色和照射你的光的顏色的混合。
比如你穿了個白衣服但紅光照你,那反射的就是偏紅色。你的顏色和光的顏色的混合比例通過θ來確定,當(dāng)θ為0,即光正對著使勁照你,那你就是很亮的紅色了,當(dāng)光正好和你平行擦著你過去,那你就沒顏色了,黑色的。光對你越正,你就越亮,否則越暗。
注意: 本文所有的公式的光照方向向量和法線都必須是標(biāo)準(zhǔn)化了的。顏色向量的RGB范圍都是0~12. 高光(Specular)
這個是可有可無的。
高光就是指光滑的物體會有一小部分特別亮的地方,趨近于鏡面反射。

unity3d中圖形學(xué)的光照原理是什么

上圖的小球,中間那塊圓形白色就是高光。同一個小球,左上偏亮右下偏暗,這樣的明暗關(guān)系是漫反射。
高光顏色強(qiáng)度公式為:

unity3d中圖形學(xué)的光照原理是什么

V是視角向量,因為高光和視角有關(guān)系,當(dāng)你繞著一個光滑球走時,你會發(fā)現(xiàn)它的高光鏡面反射的部位也會改變。 Ks就是物體鏡面反射的顏色,一般是白色,當(dāng)然如果很魔幻你想讓物體高光發(fā)藍(lán)色也可以。 R是反射光的方向向量,就是L入射光關(guān)于法線N的對稱向量。spec就是反射強(qiáng)度,看上圖那3個小球。
這個公式的理解就是:鏡面反射(高光)的顏色是入射光的顏色和鏡面反射光的顏色的疊加。鏡面反射光的強(qiáng)度取決于視角以及spec。
當(dāng)V和R平行時,即反射的光直射你的眼睛,會亮到爆炸。到V和R垂直時,光照全都照不進(jìn)你的眼,就沒有鏡面反射,沒有高光。3. 環(huán)境光(Ambient Light)
假設(shè)場景里就一個球和一個光源,那么按照目前的公式算出來,有光的地方有顏色,亮。沒光的地方一片漆黑。
但有人覺得一片漆黑不太好,應(yīng)該也能看見點東西,所以就加了一個環(huán)境光,讓整體再亮一點,從而使暗部呈現(xiàn)一些顏色。
環(huán)境光顏色計算公式為:
lj = la Ka
la是環(huán)境光的顏色,Ka是物體的環(huán)境光系數(shù),一般而言Ka = Kd = 物體本身的顏色,只有高光的Ks不是物體本身的顏色,而是偏白色。

光照計算公式
綜上,一個物體在光照下?lián)碛忻靼店P(guān)系之后的顏色公式如下:

unity3d中圖形學(xué)的光照原理是什么

就是所有光源的高光計算結(jié)果+所有光源的漫反射計算結(jié)果+環(huán)境光顏色
場景中的環(huán)境光只有一個,而發(fā)光光源可能有好幾個,所以高光和漫反射每個光源都要算,然后加起來。

unity3d中圖形學(xué)的光照原理是什么

這個公式的加標(biāo)示版本:

unity3d中圖形學(xué)的光照原理是什么

其中,E是視角向量,就是V。

unity3d中圖形學(xué)的光照原理是什么

注意:

  1. 我們算光照的時候是在相機(jī)坐標(biāo)系空間下計算的,即image space(不懂空間變換的參考我的坐標(biāo)系空間變換)。所以E(視角向量)永遠(yuǎn)都是(0,0,-1),因為我們往正前方看就是往Z=1的地方看,它的反向量就是 -1。
    為什么是相機(jī)空間?
    因為光照計算涉及方向向量L, E, N, R,我們需要在仿射空間(affine space,即pre-perspective space, 包括model, world, image 3個space)進(jìn)行變換,因為從image變換到perspective空間會扭曲圖形損失信息。model, world, image 3個空間計算光照都行,本文選image。
    在image空間下,法線等方向向量都要變換到image space,但要注意的是,法線的變換是只有旋轉(zhuǎn),沒有位移和縮放的?。。∫驗榉ň€如果位移,即在法線向量上加一個位移向量,兩個向量如果不平行,那么和向量的方向會和原法線不一致!

  2. 當(dāng)E和L不在一邊的時候,即我們在看物體正面,光從物體背面照過來,我們是什么都看不見的,是黑色,這種情況就不計算,直接跳過。當(dāng)E和L在同一邊,但法線N在另一邊的時候,算出來也是負(fù)的,不行,所以要把法線取個反再算??傊褪潜WC最后的顏色RGB在0~1范圍內(nèi)。

我們知道三角形三個頂點的光照顏色了,但屏幕像素中,落在三角形內(nèi)部的點的顏色怎么辦?
答:插值。在光柵化里我們計算過平面方程用于三角形內(nèi)部點的Z插值。那么其他的插值都可以按這個方法來。

根據(jù)插值方式的不同,shade又分為兩大類:

1. Gouraud Shading
三角形內(nèi)部點的顏色根據(jù)三個頂點的顏色插值得來,不用管內(nèi)部像素點的法線啊光照啊啥的,所以方便運算,快。但精度差了點。比如光源正好位于三角形的正中央,那么3個頂點的顏色因為離光源遠(yuǎn),所以會比較暗,那么中間點的顏色插值出來也會暗。但實際上中間點離光源近,應(yīng)該更亮才對!

unity3d中圖形學(xué)的光照原理是什么

上圖為顏色插值方法,即構(gòu)造3維平面方程,把Z分別替換為R, G, B構(gòu)造3個平面,然后帶入像素點的x,y,求出3個Z(即R, G, B)。

2. Phong Shading
為了解決Gouraud的精度問題,我們可以在內(nèi)部像素每個像素點都重新算一遍光照顏色。所以我們需要計算出內(nèi)部像素點的法線N,通過插值算。然后帶入上面說的光照方程算出該點的顏色。這樣是最準(zhǔn)確的,但是計算量稍微大一點。目前的主流引擎基本都是默認(rèn)的Phong。
法線插值就構(gòu)造3個平面方程,把Z分別換成法線N的x, y, z。
帶入像素點的x,y,求出Nx, Ny, Nz,就得到了該點的N。

unity3d中圖形學(xué)的光照原理是什么

關(guān)于“unity3d中圖形學(xué)的光照原理是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI