iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 18
0
自我挑戰組

初見Unity Shader系列 第 18

Unity中的光源

從開篇到現在,我們的Shader的效果,都免不了有「光」這個元素在,今天就開始介紹Unity中的光是甚麼吧。

目標

  • 光源類型
  • 認識繪製路徑

光源類型

Unity有四種光源,平行光、點光源、聚光燈、面光源(Area),在面板上可以看到,不管是哪一種光,他們擁有的屬性都不盡相同,讓人不知所措。

了解上面詳細的屬性,可以了解特定功能是怎麼實作的,但大多情況下,我們撰寫腳本或是Shader只會用到光的位置、方向、顏色、衰減、強度,如先前的範例,也只有用到光的位置理解角度。

繪製路徑

一個遊戲場景中,不太可能只有一個光源,所以一個物件如何和這些光源做對應的「方式」,叫做「繪製路徑(Rendering Path)」。

Unity提供了三種繪製路徑,正向、延遲、頂點照明,頂點照明是正向繪製的一個子集,如名所示,頂點照明就是以逐頂點的方式去處理光源,所以那些需要逐像素材可以達成的效果如:陰影、法線貼圖等,都是不支援的。

在先前的範例中,看到的:

...
// 設定為「正向繪製」
Pass {
    Tags {"LightMode"="Forward"}
}
...

就是在對該Pass的繪製路徑進行設定。

以下主要解講正向渲染與延遲渲染的差別。

正向渲染

為甚麼要設定這個東西?

如上面所說,一個場景不可能只有一個光源,假設今天場上有87個光源跟1個正方體,所有光源都照在這個正方體上,這樣就會處理87個Pass(註1),可想而知渲染引擎不可能一個一個同等的處理這些光源,這就是為什麼要設定繪製路徑,然後上面例子提到的「如何以等級對應這些光源的方法」就是正向繪製。

註1: 87個光源 * 1個模型

在Unity的正向繪製中,光源有三種處理方式,逐頂點、逐像素、球諧函數(SH),逐像素是對光源處理的重要度最高的,依序是逐頂點跟球諧函數,預設上,會4個光源是逐像素,然後4個為逐頂點,其餘的都作球諧函數處理,還有最亮的平行光會當作逐像素處理。

開發者可以利用光源面板上的"Render Mode"屬性,選取Important來告訴渲染引擎,這個光源要以逐像素做使用。

但也不是所有的光源都可以逐像素,上面所指的預設上,開發者可以到Project Setting > Quality > Pixel Light Count做設定。

延遲渲染

延遲渲染出現的時間比正向渲染還要早,但因為正向渲染會遇到效能瓶頸,這幾年又成為了一種選擇。延遲渲染大多的使用時機是在許多即時光源情況下,雖是這樣說,這是可以完美處理多光源問題的方法,但事實上,我認為是缺點大於優點的:

  • 延遲渲染不支援真正的反鋸齒功能
  • 延遲渲染不能處理透明物體
  • 對硬體有一定要求,需要支援Multiple Render Texture

下面這張圖告訴了延遲渲染是怎麼做:

from LearnOpenGL

正向渲染與延遲渲染能使用的內建函數也不同,請注意

Reference


上一篇
切線空間
下一篇
簡單的陰影實作方法
系列文
初見Unity Shader30

尚未有邦友留言

立即登入留言