目錄
綜述
- 標準光照模型僅僅是一個經驗模型,並不完全複合真實世界中的光照現象。
- 計算光照模型時,需要統一各個方向矢量所在的座標空間,且方向都是從該點指向其他處的。
- 渲染包含了兩大部分:決定一個像素的可見性,決定這個像素上的光照計算。而光照模型是用於決定在一個像素上進行怎樣的光照計算。
- 如何量化光?
在光學中,使用輻照度來量化光。對於平行光來說,它的輻照度可通過計算在垂直於 l(光照方向)的單位面積上單位時間穿過的能量來得到。
在計算光照模型時,需要知道一個物體表面的輻照度,而物體表面往往是和 l 不垂直的,可以使用光源方向 l 和表面法線 n 之間夾角的餘弦值來得到。需要注意的是,這裏默認方向矢量的模都爲 1。 - 根據入射光線的數量和方向,可以計算出出射光線的數量和方向,使用出射度來描述它。輻照度和出射度之間是滿足線性關係的,而它們之間的比值就是材質的漫反射和高光反射屬性。
- 着色
着色指的是根據材質屬性(如漫反射屬性等)、光源信息(如光源方向、輻照度等),使用一個等式去計算沿某個觀察方向的出射度的過程。這裏使用的等式也被稱爲光照模型(Light Model)。
在渲染中,通常會基於表面的入射光線的入射輻射率 Li 來計算出射輻射率 Lo。這個過程往往被稱爲是着色過程。 - BRDF 光照模型
當給定模型表面上的一個點時,BRDF 包含了對該點外觀的完整的描述。在圖形學中,BDRF 大多使用一個數學公式來表示,並提供了一些參數來調整材質屬性。通俗來講,當給定入射光線的方向和輻照度後,BDRF 可以給出某個出射方向上的光照能量分佈。
準光照模型
- 標準光照模型只關心直接光照,也就是那些直接從光源發射出來照射到物體表面後,經過物體表面的一次反射直接進入攝像機的光線。
- 它的基本方法是,把進入到攝像機內的光線分爲 4 個部分,每個部分使用一種方法來計算它的貢獻度。
自發光(Cemissive)
這部分用於描述當給定一個方向時,模型表面會向該方向發射多少的輻射量。當沒有使用全局光照時,這些自發光表面不會照亮周圍物體,只是本身看起來更亮而已。
高光反射(Cspecular)
這個部分用於描述當光線從光源照到模型表面時,模型鏡面反射產生的光。
漫反射(Cdiffuse)
這個部分用於描述當光線從光源照到模型表面時,模型向各個方向產生的光。
環境光(Cambient)
這個部分用來描述其他間接的光。
標準光照模型公式
環境光
雖然標準光照模型的重點在於描述直接光照,但在真實的世界中,物體也可以被間接光照所照亮。間接光照指的是,光線通常會在多個物體之間反射,最後進入攝像機。也就是說,在光線進入攝像機之前,經過了不止一次的物體反射。例如,在紅地毯上放置一個淺灰色的沙發,那麼沙發底部也會有紅色,這些紅色是由紅地毯反射了一部分光線,在反彈到沙發上的。
在標準光照模型中,使用環境光部分來近似模擬間接光照。環境光通常是一個全局變量,即場景中的所有物體都是用這個環境光。
Unity -> Window -> Rendering -> Light Setting 中設置。
內置變量 UNITY_LIGHTMODEL_AMBIENT 可以得到環境光的顏色和強度信息。
自發光
光線可以直接由光源發射進入攝像機,而不需要經過任何物體的反射。標準光照模型使用自發光來計算這部分的貢獻度。它的計算比較簡單,直接使用該材質的自發光顏色。
計算自發光,只需要在片元着色器最後輸出的顏色之前,把材質的自發光顏色添加到輸出顏色上即可。
漫反射
漫反射,是投射在粗糙表面上的光向各個方向反射的現象。當一束平行的入射光線射到粗糙的表面時,表面會把光線向着四面八方反射,所以入射線雖然互相平行,由於各點的法線方向不一致,造成反射光線向不同的方向無規則地反射,這種反射稱之爲“漫反射”或“漫射”。這種反射的光稱爲漫射光。很多物體,如植物、牆壁、衣服等,其表面粗看起來似乎是平滑,但用放大鏡仔細觀察,就會看到其表面是凹凸不平的,所以本來是平行的太陽光被這些表面反射後,瀰漫地射向不同方向。
漫反射光照符合蘭伯特定律:反射光線的強度與表面法線和光源方向之間夾角的餘弦值成正比。漫反射部分的計算如下:
n 表面法線
I 指向光源的單位矢量
Mdiffuse 材質的漫反射顏色
Clight 光源顏色
max 防止物體被從後面來的光源照亮
高光反射
經驗模型,它並不完全符合真實世界中的高光反射現象。它可用於計算那些沿着完全鏡面反射方向被反射的光線(物體直接反射光源),他可以讓物體看起來是光澤的,例如金屬材質。
Phong 模型計算高光反射的部分:
Mgloss 光澤度,反光度,控制高光區域的大小,值越大,亮點越小
Mspecular 材質的高光反射顏色,它用於控制該材質對於高光反射的強度和顏色
Clight 光源顏色和強度
v 是視角方向
r 是反射方向,可以通過計算反射方向的函數
r = reflect(I,n)
I,入射方向
n 法線方向
r = 2 (n * I)* n - I 菱形
Blinn 模型的公式
h = normalize(v + I)
比較
在硬件實現時,如果攝像機和光源距離模型足夠遠的話,Blinn模型會快於Phong模型,因爲此時可以任務 v 和 I 都是固定值,因此 h 將是常量。但是當 v 和 I 不固定時,Phong模型可能反而更快一些
逐像素還是逐頂點?
逐頂點
- 頂點着色器中;
- 也被稱爲高洛德着色。在每個頂點上計算光照,然後會在渲染圖元內部進行線性插值,最後輸出成像素顏色;
- 優點:
由於頂點數目往往遠小於像素數目,因此逐頂點光照的計算量往往要小於逐像素光照; - 缺點:
- 由於逐頂點光照依賴於線性插值來得到像素光照,因此,當光照模型中有非線性的計算(如計算高光反射時),逐頂點光照就會出問題。
- 由於逐頂點光照會在渲染圖元內部對頂點顏色進行插值,這會導致渲染圖元內部的顏色總是暗於頂點處的最高顏色值,這在某些情況下會產生明顯的棱角現象。
逐像素
- 片元着色器中;
- 以每個像素爲基礎,得到它的法線,然後進行光照模型計算。這種在面片之間對頂點法線進行插值的技術被稱爲 Phong 着色。