Carved Marker

Per Pixel Lighting [Part 5]

用同樣的方法,其實還可以做到很多有趣的效果。因為,可以經由調整 cubic enviornment map 的計算法式,來調整打光的計算方式。

一個例子是做出 specular 的效果。在 Direct3D 和 OpenGL 中,計算 specular 的方式都是用 halfway vector 和 normal vector 的內積,再做 n 次方。經由調整 n 的值,可以產生相當不錯的結果。不過,傳統的打光方式,只在每個頂點上面做,所以效果很不好。

不過,前面所說明的方式,同樣可以用在 specular 上面,因為它和 diffuse 一樣,是某個向量和法向量的內積。問題在於,這個「某個向量」不再是光的方向,而是 halfway vector,它是光的向量和觀察者的向量相加後,再 normalize 後的結果。為了簡單起見,我們可以假設觀察者的位置是在無限遠的地方(即 infinite viewer),這樣一來,觀察者的向量就是常數。而光是平行光,也是常數。這樣一來,halfway vector 也就變成常數了。

和前面的例子一樣,先以 <0, 0, -1> 為 halfway vector,算出一個 cubic environment map。這個 cubic environment map 會隨著 n 而不同,所以對不同的 n 都要算出一個不同的貼圖。接著,再算出 halfway vector,把它轉回 <0, 0, -1>,再設定 texture stage,讓它和光的 specular 的顏色相乘。最後,畫出整個物體,用 blending 的方式,把它加到前面已經畫好的 ambient + diffuse 的結果上,就大功告成了。

要注意的是,specular 不受到物體的顏色影響,所以不需要把 specular 再乘上物體本身的貼圖。另外,我們也忽略了物體本身的 specular 顏色,因為這並不常用。這樣的計算所得到的結果如下圖所示:

Capsule with per pixel specular

在上圖中,為了讓 specular 的亮點更為明顯,所以 diffuse 的亮度稍微調低了一些。它所使用的 n 值為 160。

另一個有趣的例子,是做出類似卡通的效果。卡通的顏色比較平面化,往往使用同一個顏色來表示一整個漸層。而且,卡通的顏色通常比較亮一些,在光線照射不到的地方,也很少是全黑的。所以,可以把漸層的顏色改成用一些相同的顏色代替。如下圖所示:

Palette for cartoon rendering

上面的例子中,只使用三種層次來取代原先的 256 種層次。以這種方式來產生 diffuse 的 cubic environment map 之後,再套用到同樣的「膠囊」上面,就會變成:

Capsule with cartoon rendering

上圖中,為了讓效果更清楚,所以稍微改變了一下觀察者的位置。其它如光源的位置及模型等都沒有改變。

當然,要真的做到像卡通的效果,還需要為物體加上黑邊。不過,這已經超出了 per pixel lighting 的範圍了。將來有機會再來討論這一方面的技巧。

[Part 1] [Part 2] [Part 3] [Part 4] [Part 5] [Part 6] [Part 7]

12/27/2000, Ping-Che Chen


Sorry, Traditional Chinese only. This page is encoded in UTF-8.

Copyright© 2000 Ping-Che Chen