【UnityShader】基礎光照類型

綜述

  1. 標準光照模型僅僅是一個經驗模型,並不完全複合真實世界中的光照現象。
  2. 計算光照模型時,需要統一各個方向矢量所在的座標空間,且方向都是從該點指向其他處的。
  3. 渲染包含了兩大部分:決定一個像素的可見性,決定這個像素上的光照計算。而光照模型是用於決定在一個像素上進行怎樣的光照計算。
  4. 如何量化光?
      在光學中,使用輻照度來量化光。對於平行光來說,它的輻照度可通過計算在垂直於 l(光照方向)的單位面積上單位時間穿過的能量來得到。
      在計算光照模型時,需要知道一個物體表面的輻照度,而物體表面往往是和 l 不垂直的,可以使用光源方向 l 和表面法線 n 之間夾角的餘弦值來得到。需要注意的是,這裏默認方向矢量的模都爲 1。
  5. 根據入射光線的數量和方向,可以計算出出射光線的數量和方向,使用出射度來描述它。輻照度和出射度之間是滿足線性關係的,而它們之間的比值就是材質的漫反射和高光反射屬性。
  6. 着色
      着色指的是根據材質屬性(如漫反射屬性等)、光源信息(如光源方向、輻照度等),使用一個等式去計算沿某個觀察方向的出射度的過程。這裏使用的等式也被稱爲光照模型(Light Model)。
      在渲染中,通常會基於表面的入射光線的入射輻射率 Li 來計算出射輻射率 Lo。這個過程往往被稱爲是着色過程。
  7. BRDF 光照模型
      當給定模型表面上的一個點時,BRDF 包含了對該點外觀的完整的描述。在圖形學中,BDRF 大多使用一個數學公式來表示,並提供了一些參數來調整材質屬性。通俗來講,當給定入射光線的方向和輻照度後,BDRF 可以給出某個出射方向上的光照能量分佈。

準光照模型

  1. 標準光照模型只關心直接光照,也就是那些直接從光源發射出來照射到物體表面後,經過物體表面的一次反射直接進入攝像機的光線。
  2. 它的基本方法是,把進入到攝像機內的光線分爲 4 個部分,每個部分使用一種方法來計算它的貢獻度。

自發光(Cemissive

  這部分用於描述當給定一個方向時,模型表面會向該方向發射多少的輻射量。當沒有使用全局光照時,這些自發光表面不會照亮周圍物體,只是本身看起來更亮而已。

高光反射(Cspecular

  這個部分用於描述當光線從光源照到模型表面時,模型鏡面反射產生的光。

漫反射(Cdiffuse

  這個部分用於描述當光線從光源照到模型表面時,模型向各個方向產生的光。

環境光(Cambient

  這個部分用來描述其他間接的光。

標準光照模型公式

環境光

  雖然標準光照模型的重點在於描述直接光照,但在真實的世界中,物體也可以被間接光照所照亮。間接光照指的是,光線通常會在多個物體之間反射,最後進入攝像機。也就是說,在光線進入攝像機之前,經過了不止一次的物體反射。例如,在紅地毯上放置一個淺灰色的沙發,那麼沙發底部也會有紅色,這些紅色是由紅地毯反射了一部分光線,在反彈到沙發上的。
  在標準光照模型中,使用環境光部分來近似模擬間接光照。環境光通常是一個全局變量,即場景中的所有物體都是用這個環境光。
  Unity -> Window -> Rendering -> Light Setting 中設置。
  內置變量 UNITY_LIGHTMODEL_AMBIENT 可以得到環境光的顏色和強度信息。

自發光

  光線可以直接由光源發射進入攝像機,而不需要經過任何物體的反射。標準光照模型使用自發光來計算這部分的貢獻度。它的計算比較簡單,直接使用該材質的自發光顏色。
  計算自發光,只需要在片元着色器最後輸出的顏色之前,把材質的自發光顏色添加到輸出顏色上即可。

漫反射

  漫反射,是投射在粗糙表面上的光向各個方向反射的現象。當一束平行的入射光線射到粗糙的表面時,表面會把光線向着四面八方反射,所以入射線雖然互相平行,由於各點的法線方向不一致,造成反射光線向不同的方向無規則地反射,這種反射稱之爲“漫反射”或“漫射”。這種反射的光稱爲漫射光。很多物體,如植物、牆壁、衣服等,其表面粗看起來似乎是平滑,但用放大鏡仔細觀察,就會看到其表面是凹凸不平的,所以本來是平行的太陽光被這些表面反射後,瀰漫地射向不同方向。
  漫反射光照符合蘭伯特定律:反射光線的強度與表面法線和光源方向之間夾角的餘弦值成正比。漫反射部分的計算如下:

Cdiffuse = (Clight*Mdiffuse)max(0,n*l)
參數:
  n 表面法線
  I 指向光源的單位矢量
  Mdiffuse 材質的漫反射顏色
  Clight 光源顏色
  max 防止物體被從後面來的光源照亮

高光反射

  經驗模型,它並不完全符合真實世界中的高光反射現象。它可用於計算那些沿着完全鏡面反射方向被反射的光線(物體直接反射光源),他可以讓物體看起來是光澤的,例如金屬材質。

Phong 模型計算高光反射的部分:

Cspecular = (Clight * Mspecular)max(0, v*r)Mgloss
參數:
  Mgloss 光澤度,反光度,控制高光區域的大小,值越大,亮點越小
  Mspecular 材質的高光反射顏色,它用於控制該材質對於高光反射的強度和顏色
  Clight 光源顏色和強度
  v 是視角方向
  r 是反射方向,可以通過計算反射方向的函數
    r = reflect(I,n)
      I,入射方向
      n 法線方向
      r = 2 (n * I)* n - I 菱形

Blinn 模型的公式

Cspecular = (Clight * Mspecular)max(0, n*h)Mgloss
參數:
  h = normalize(v + I)

比較

  在硬件實現時,如果攝像機和光源距離模型足夠遠的話,Blinn模型會快於Phong模型,因爲此時可以任務 v 和 I 都是固定值,因此 h 將是常量。但是當 v 和 I 不固定時,Phong模型可能反而更快一些

逐像素還是逐頂點?

逐頂點

  • 頂點着色器中;
  • 也被稱爲高洛德着色。在每個頂點上計算光照,然後會在渲染圖元內部進行線性插值,最後輸出成像素顏色;
  • 優點:
    由於頂點數目往往遠小於像素數目,因此逐頂點光照的計算量往往要小於逐像素光照;
  • 缺點:
    1. 由於逐頂點光照依賴於線性插值來得到像素光照,因此,當光照模型中有非線性的計算(如計算高光反射時),逐頂點光照就會出問題。
    2. 由於逐頂點光照會在渲染圖元內部對頂點顏色進行插值,這會導致渲染圖元內部的顏色總是暗於頂點處的最高顏色值,這在某些情況下會產生明顯的棱角現象。

逐像素

  • 片元着色器中;
  • 以每個像素爲基礎,得到它的法線,然後進行光照模型計算。這種在面片之間對頂點法線進行插值的技術被稱爲 Phong 着色。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章