unity shader學習筆記(一)——基礎光照之標準光照模型定義

標準光照模型

標準光照模型只關心直接光照(direct light)。它把進入攝像機的光照分爲4個部分:

  • 自發光(emissive),這部分用於給定一個方向時,物體表面會向這個方向產生多少的光,當沒有使用全局光照時,自發光物體不會照亮周圍物體,只是本身看起來更亮而已。
  • 高光反射(specular),這個部分用於描述當光線從光源照到物體表面時,物體鏡面反射產生的光。
  • 漫反射(diffuse)這個部分是光線從光源照到物體表面時,物體向各個方向產生的光。
  • 環境光(ambient)這個部分用來描述其他間接的光。

標準光照模型公式

1.環境光

  在標準光照模型中,環境光通常會比較簡單,就是給定的一個全局變量,就是說場景中所有物體都使用同一個環境光。

2.自發光

  標準光照模型中自發光可以直接使用材質的顏色。(Unity5中的全局光照系統可以模擬自發光物體對周圍物體的影響)

3.漫反射

  漫反射可使用蘭伯特定律(Lamberts Law),即反射光線的強度與表面法線和光源方向之間的夾角的餘弦成正比。計算公式如下:
       
        這裏寫圖片描述 
         
  其中LC(Light Color)是光照顏色和強度,MD(Material Diffuse)是材質的漫反射顏色,N(Normal)是表面法線向量,L(Light)是光源的單位矢量。max函數是爲了防止法線和光源點乘結果爲負,可防止物體被後面的光照照亮。
  漫反射還可以通過一種蘭伯特定律的視覺加強模型半蘭伯特光照模型來計算,半蘭伯特光照模型沒有使用max函數來防止法線和光源方向的點乘爲負的情況,而是對其結果進行了一個X倍的縮放再加上一個Y大小的偏移大多數情況下,x和y爲0.5。計算公式如下:
       
        這裏寫圖片描述
       
  這樣就可以把法線和光源方向的點乘的結果範圍從[-1, 1]映射到[0, 1]。就是蘭伯特光照模型中,對物體背面的結果會映射到同一個值,即0;而在半蘭伯特光照模型中,背面也是有明暗變換,會映射到不同的值。
  

4.高光反射

  計算高光反射需要知道表面法線、視角方向、光源方向、反射方向,其中反射方向可以通過其他三個向量計算得到。計算公式如下:
       
       這裏寫圖片描述
       
  這樣就可以使用Phong模型來進行計算高光反射。計算公式如下:
       
        這裏寫圖片描述
       
  其中,V(View)是視角方向,MS(Material Spscular)是材質的高光反射顏色,MG(Material Gloss)是材質的反光度(Shininess)。同樣,這裏也要防止V*R的結果爲負。
  Blinn提出了一個相對簡單的方法來得到類似的效果。他的思想就是不計算反射方向R。他計算了一個新的矢量H,是通過V和L取平均再歸一得到的。即:
       
        這裏寫圖片描述
       
  所以,Blinn-Phong模型的公式如下:
       
        這裏寫圖片描述
       
  在攝像機和光源距離物體足夠遠的情況下,Blinn-Phong模型會快於Phong模型,因爲H將是一個常量。當V或者L不是定值的時候,Phong模型反而會更快一點。

光照模型計算着色器

光照模型一般可以在以下兩種着色器中計算:

  • 片元着色器:也叫逐像素光照(per-pixel lighting)。一般以每個像素爲基礎,得到它的法線(可以是對頂點法線插值得到,也可以從紋理法線中採樣得到),然後進行光照模型計算。
  • 頂點着色器:也叫逐頂點光照(per-vertex lighting)。是在每個頂點上計算光照,然後在渲染圖元內部進行線性插值,最後輸出成像素顏色。

由於頂點數目遠小於像素數目,因此逐頂點光照的計算量要小於逐像素光照。但是,由於逐頂點光照依賴於線性插值來得到像素光照,所以當光照模型中有非線性的計算時(計算高光反射),逐頂點就會出問題。而且由於逐頂點光照會在渲染圖元內部對頂點顏色進行插值,會導致渲染圖元內部顏色總是暗於頂點處的最高顏色值,這在某些情況下會產生明顯的棱角現象。
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章