Unity Shader學習-3.光照模型

光照是3D游戲中一個必不可少的部分,場景氛圍的渲染需要光照來表現:

巫師3.jpg

上面是巫師3中的夜景,如果沒有光的畫整個表現力將會降低很大的一個層次,這一節我們將了解光照的形成過程以及各個光照模型。

一、光源:

1.光形成圖像的過程

先來了解一下光線從產生到形成我們眼中圖像的過程:

光形成圖像

這當中涉及到光的反射、折射,最后光進入人眼,形成了圖像,這就是光形成圖像的過程。

2.光源的相關要素

1.矢量:

光源是一個矢量,他具體位置和方向,例如Unity中的方向光、點光源,都具備矢量的性質。

2.量化:

下面是維基百科中關于光強的介紹

輻照度:輻照度表示各種頻率輻射的總量。物理學者時常也會分開檢驗輻射頻譜的每一單獨頻率。假設對于入射于曲面的輻射做這動作,則稱這輻射為光譜輻照度(spectral irradiance),國際單位制的單位為W/m2。在光學和激光物理學中,輻照度也被叫做光強。

地面上一塊平面的總輻照度等于“直接輻照度”與“漫輻照度”的代數和,光強與光和物體表面的夾角有關,具體會在下面介紹。

光強與夾角相關

3.光的吸收與散射

光線發射出來與物體相交后,會有兩個結果,一個是散射另一個是吸收

  • 散射:只改變光線方向,而不改變光線密度和顏色。散射根據光線改變后的方向分為兩種,若光線散射到物體內部的現象則稱為折射,而散射到物體外部的現象則稱為反射
  • 吸收:只改變光線的密度和顏色,而不改變光線方向。
光的吸收/散射

從上圖中我們可以看到光從發射到與物體表面相交后的各種情況,光線有的被吸收有的被反射有的發生了折射。其中的藍色光線表示漫反射,而黃色光線表示高光反射。在光照模型中我們會使用不同部分來表示光線的這幾種情況:

  • 高光反射(Specular):表示物體表現是如何直接反射光線的
  • 漫反射(Diffuse):表示光線如何被折射及吸收后反射的

通常用出射度表示出射光線的數量和方向,出射度輻照度之間是存在線性關系的。

4.著色

著色指的是根據材質屬性、光源屬性,使用一個公式去計算沿某個觀察方向的光線出射度的過程,這個公式我們也將之稱為光照模型

5.各向異性與各向同性

各向異性 (anisotropy ) 與 均向性 相反,是指在不同方向具有不同行為的性質,也就是其行為與方向有關。如在物理學上,沿著材料做不同方向的量測,若會出現不同行為,通常稱該材料具有某種“ 各向異性 ” ,這樣的材料表面稱為各向異性表面( anisotropic surface )。

光照模型中也存在著各向同性和各向異性的區別,例如Lambert漫反射模型是各向同性的,無論我們從哪個方向進行觀察,物體表面的光照表現都是不變的,而Phong光照模型中的高光反射則是各向異性的,物體表面的光照表現會隨著觀察角度的變化而變化。

二、光照模型

現實世界的光照是非常復雜的,若要準確的模擬,整體計算量會非常的大,這在游戲渲染中是不現實的,而光照模型則提供了一種性價比較高的方案,它是一種經驗模型,是對真實場景進行理想化和簡化后的模型,可以模擬光從發射到與物體相交再到人眼中的效果。

計算機圖形學第一定律:如果它看來是對的,那么它就是對的

現實世界中的光照,分為兩種直接光照間接光照

  • 直接光照:表示直接從光源發射出來照射到物體表面后,光線經過物體表面的一次反射后直接進入攝像機

  • 間接光照:表示光線從光源發射出來后,經過不止一次的物體反射后進入攝像機

標準光照模型

光照模型有不同種類,而游戲引擎中往往只使用一個光照模型,我們稱之為標準光照模型。一般光照模型會包含以下幾個要素:

  • 自發光(Emission):用于描述當給定一個方向時,一個表面本身會向該方向發射多少輻射量。
  • 環境光(Ambient):在現實世界中無論多么黑暗,世界都會有一些光亮(月光、遠處的光)在照亮物體,環境光就是用于模擬無論什么情況都會給物體顏色的這種情況。
  • 漫反射(Diffuse):模擬一個發光物體對物體的方向性影響,面向光的一面會比另一面更亮。
  • 高光(Specular):模擬有光澤物體表面上的亮點,其顏色更傾向于光的顏色而不是物體表面的顏色。

標準光照模型只關心直接光照,下面說一下標準光照模型的歷史。

1.Lambert模型

Lambert是理想的漫反射模型,他表現的材質較為均勻,不能反映粗糙度帶來的變化。

Diffuse

同等數量的光照射的面積越小,單位表面積收到的光的能量越多,這個原則也構成了Lambert定律

Lambert定律:反射光照的強度與表面法線和光源方向夾角的余弦值成正比

漫反射模型

因此Lambert對應的公式為:

C(result) = n · i · (C(light)·C(diffuse))

其中n向量表示表面法線,i向量表示光與表面交點指向光源的向量,C(light)表示光的顏色,C(diffuse)表示漫反射的系數。

2.Phong(馮氏光照模型)(1975)

馮氏光照模型引入了高光來增強渲染真實感,從下圖可以看到,他引入了觀察者視角這一參數,反射向量R與視角向量V的夾角決定了高光的強度。

Phong = Ambient(環境光)+ Diffuse(漫反射) + Specular(高光)

Phong

從上圖可以看到,Phong氏光照模型由三個部分組成:環境光、漫反射、高光反射。其中的Diffuse在上面已經講過了,而Specular(高光反射)則是一個與用戶視線相關的值,通過反射光線的向量視線方向的點積來影響高光的值,如果反射光線與視線方向的夾角越小,則高光的作用越大。同時還加入了一個發光值(Shiness),來控制高光擴散程度。下面是Phong模型的數學展示圖。

Phong光照模型

C(Specular) = (C(light)·C(Specular))·pow(max(0, V·R), shiness)
其中C(light)表示光的顏色,C(Specular)表示高光反射的系數,shiness則表示發光值。下面看下不同的發光值對Phong的影響,可以看到發光值越大,散射得越少,高光點越小。

不同的發光值

Phong模型是在片段著色器中實現的,而在早期的光照著色器中,開發者在著色器中實現馮氏光照,這種模型Gouraud模型,下面是這兩者的區別。

  • Phong模型:在片段著色器中實現,效果好,效率相對低
  • Gouraud模型:在頂點著色器中實現,效果差,效率相對高
Phong&Gouraud

3.Blinn-Phong(1977)

Phong模型效果不錯,性能也較高,但是,如果光源在靠近視野的位置的話就會出現反射向量與視線向量的夾角大于90度,從上面的Specular公式可以知道,Phong模型不允許兩向量的點積值小于0,也就是不允許他們的夾角大于90度。

光源在靠近視野的位置

上面這種情況會導致鏡面區域邊緣迅速減弱并截止,如下圖遠處的暗處:

迅速減弱 截止

1977年James F. Blinn引入了Blinn-Phong著色,它擴展了我們目前所使用的Phong著色。Blinn-Phong模型很大程度上和Phong是相似的,不過它稍微改進了Phong模型,使之能夠克服我們所討論到的問題。

Blinn-Phong

Blinn-Phong中引入了半程向量這一概念,半程向量h是視線向量與光線方向向量的和歸一化后的結果,將這個值與表面法線進行點乘得到結果。

h = normalize(lightdir + viewdir)
C(Specular) = (C(light)·C(Specular))·pow(max(0, h·n), shiness)

引入半程向量來計算鏡面反射后,我們再也不會遇到Phong著色的截止問題了,下面是對比圖:

Phong & Blinn-Phong

可以看到截止的問題已經消失了,整個過渡更加的真實。

Unity實現對應光照模型

To be continued...

參考

[1]https://zh.wikipedia.org/wiki/輻照度
[2]http://www.cnblogs.com/mengdd/archive/2013/08/05/3238123.html
[3]http://learnopengl-cn.readthedocs.io/zh/latest/02%20Lighting/02%20Basic%20Lighting/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容

  • 版本記錄 前言 OpenGL 圖形庫項目中一直也沒用過,最近也想學著使用這個圖形庫,感覺還是很有意思,也就自然想著...
    刀客傳奇閱讀 6,140評論 0 2
  • 現實世界的光照是極其復雜的,而且會受到諸多因素的影響,這是以目前我們所擁有的處理能力無法模擬的。因此OpenGL的...
    IceMJ閱讀 2,002評論 1 6
  • 一、Surface Output (表面著色器的標準輸出結構)Surface Shader的標準輸出結構-第一要素...
    CarlDonitz閱讀 946評論 0 1
  • 一.標準光照模型OpenGL與Direct3D提供了幾乎相同的固定功能光照模型。什么是固定功能光照模型?在過去只有...
    karma085閱讀 3,660評論 0 2
  • 給予 父母給予我生命 書籍給予我知識 食物給予我能量 朋友給予我交際 工作給予我成長 生活給予我成熟 經常在唱誦給...
    Panda盼子閱讀 250評論 4 0