天天看點

Unity3D - Shader - 基礎光照如何看到這個世界的标準光照模型Unity中的環境光和自發光

如何看到這個世界的

如何産生一個圖像:

  • 光線從光源(light source)中被發射出來
  • 光線和場景中的一些物體相交;一些被物體吸收了,而另一些光線被散射到其他方向。
  • 眼睛(錄影機)吸收到一些光,産生了一張圖像。

光線和物體相交隻有兩個結果,吸收和散射:

  • 散射隻改變光的方向,但不改變光的密度和顔色
  • 吸收隻改變光線的密度和顔色,但不改變光線的方向

散射的方向:

  • 一種會散射到物體内部,稱為折射或者透射(refraction/transmission)
  • 一種散射到物體外部,稱為反射(reflection)

不同的散射方向在光照模型中使用不同的部分來計算:

  • 高光反射(specular)部分表示物體表面是如何反射光線的
  • 漫反射(diffuse)部分表示有多少光線會被折射、吸收和散射出表面的。

輻照度和出射度:

  • 輻照度用于量化光(一個光源發出了多少光)
  • 出射度用于描述出射光線的數量和方向

着色(shading):

  • 根據材質屬性(如漫反射屬性)、光源資訊(光源方向、輻照度),使用等式去計算沿着某個觀察方向的出射度的過程,這個等式就是光照模型(Light Model)。

BRDF光照模型(Bidirectional Reflectance Distribution Function):

  • 該模型對真是場景進行理想化和簡化後的模型,也稱為經驗模型,其用于解釋:當光線從某個方向照射到一個表面時,有多少光線被反射,反射的方向有哪些。

标準光照模型

标準光照模型早于BRDF光照模型。标準光照模型隻關心直接光照(direct light),也就是那些直接從光源發射出來照射到物體表面後經過物體表面的一次反射直接進入錄影機的光線。

基本光照模型的基本上發是将進入眼睛(錄影機)的光線分為4個部分:

  • 自發光(emissive)部分,該部分用于描述當給定一個方向時,一個表面本身會向該方向發射多少輻射量。
  • 高光反射(specular)部分,該部分用于描述當光線從光源照射到模型表面時,該表面會在完全鏡面反射方向散射多少輻射量。
  • 漫反射(diffuse)部分,該部分用于描述當光線從光源照射到模型表面時,該表面會在每個方向散射多少輻射量。
  • 環境光(ambient)部分,該部分用于描述當其他所有的間接光照。

環境光

間接光照:

  • 光線通常會在多個物體之間反射,最後進入眼睛(錄影機)

環境光:

  • 标準光照模型使用環境光來模拟間接光照。
  • 環境光是一個全局變量,場景内的所有物體都使用同一個環境光。
  • 計算等式: Cambient=gambient

自發光

光照也可以不經過反射直接進入到眼睛(錄影機)。

自發光:

  • 标準光照模型使用自發光來計算這部分光照。
  • Cemissive=memissive

    (直接使用材質的自發光顔色)

漫反射

漫反射光照:

  • 是對被物體表面随機散射到各個方向的輻射度進行模組化的。
  • 視角位置不重要,入射光線角度很重要。
  • 漫反射符合蘭伯特定律(Lambert’s law):反射光線的強度與表面法線和光源方向之間夾角的餘弦值成正比。
  • cdiffuse=(clight∗mdiffuse)max(0,n^∗l^)
  • n^ 是表面法線, l^ 是光源的機關矢量, mdiffuse 是材質的漫反射顔色, clight 是光源顔色

高光反射

高光反射:

  • 高光反射是一個經驗模型。
  • 它用于計算那些沿着完全鏡面反射方向被反射的光線,可以讓物體看起來更有光澤(金屬材質)。
  • 計算高光反射需要知道:表面法線 n^ ,視角方向 v^ ,光源方向 l^ ,反射方向 r^ 等。

反射方向可以由其他資訊計算: r^=2(n^∗l^)n^−l^

Cspecular=(Clightmspecularmax(0,v^∗r^)mgloss

mgloss 是材質的光澤度(gloss),也稱為反光度(shininess),用于控制高光區域的亮點有多大, mgloss 越大,光點越小。 mspecular 是材質的高光反射顔色,用于控制該材質對高光反射的強度與顔色。 clight 則是光源的強度。

在何處計算這些光照模型:

  • 在片元着色器中計算,稱為逐像素光照(per-pixel lighting)
  • 在頂點着色器中計算,稱為逐頂點光照(per-vertex lighting)

Unity中的環境光和自發光

環境光:

  • 通過Unity内置變量

    UNITY_LIGHTMODEL_AMBIENT

    就可以得到環境光的顔色和強度

自發光:

  • 在片元着色器最後輸出顔色淺,把材質的自發光顔色加到輸出顔色上即可。

繼續閱讀