光照是3D游戲中一個必不可少的部分,場景氛圍的渲染需要光照來表現:
上面是巫師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是理想的漫反射模型,他表現的材質較為均勻,不能反映粗糙度帶來的變化。
同等數量的光照射的面積越小,單位表面積收到的光的能量越多,這個原則也構成了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氏光照模型由三個部分組成:環境光、漫反射、高光反射。其中的Diffuse在上面已經講過了,而Specular(高光反射)則是一個與用戶視線相關的值,通過反射光線的向量與視線方向的點積來影響高光的值,如果反射光線與視線方向的夾角越小,則高光的作用越大。同時還加入了一個發光值(Shiness),來控制高光擴散程度。下面是Phong模型的數學展示圖。
C(Specular) = (C(light)·C(Specular))·pow(max(0, V·R), shiness)
其中C(light)表示光的顏色,C(Specular)表示高光反射的系數,shiness則表示發光值。下面看下不同的發光值對Phong的影響,可以看到發光值越大,散射得越少,高光點越小。
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中引入了半程向量這一概念,半程向量h是視線向量與光線方向向量的和歸一化后的結果,將這個值與表面法線進行點乘得到結果。
h = normalize(lightdir + viewdir)
C(Specular) = (C(light)·C(Specular))·pow(max(0, h·n), shiness)
引入半程向量來計算鏡面反射后,我們再也不會遇到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/