Per Pixel Lighting [Part 5]
来源:互联网 发布:格式化硬盘还能恢复数据吗 编辑:程序博客网 时间:2024/05/17 15:02
用同樣的方法,其實還可以做到很多有趣的效果。因為,可以經由調整 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 顏色,因為這並不常用。這樣的計算所得到的結果如下圖所示:
在上圖中,為了讓 specular 的亮點更為明顯,所以 diffuse 的亮度稍微調低了一些。它所使用的 n 值為 160。
另一個有趣的例子,是做出類似卡通的效果。卡通的顏色比較平面化,往往使用同一個顏色來表示一整個漸層。而且,卡通的顏色通常比較亮一些,在光線照射不到的地方,也很少是全黑的。所以,可以把漸層的顏色改成用一些相同的顏色代替。如下圖所示:
上面的例子中,只使用三種層次來取代原先的 256 種層次。以這種方式來產生 diffuse 的 cubic environment map 之後,再套用到同樣的「膠囊」上面,就會變成:
上圖中,為了讓效果更清楚,所以稍微改變了一下觀察者的位置。其它如光源的位置及模型等都沒有改變。
當然,要真的做到像卡通的效果,還需要為物體加上黑邊。不過,這已經超出了 per pixel lighting 的範圍了。將來有機會再來討論這一方面的技巧。
- Per Pixel Lighting [Part 5]
- Per Pixel Lighting [Part 2]
- Per Pixel Lighting [Part 3]
- Per Pixel Lighting [Part 4]
- Per Pixel Lighting [Part 6]
- Per Pixel Lighting [Part 7]
- Per-pixel lighting
- Cg per-pixel lighting
- Cg anisotropic per-pixel lighting
- Per-Pixel Lighting 逐象素光照
- Per Pixel Lighting(逐像素光照)
- Cg two-sided per-pixel lighting
- Cg per-pixel lighting with vertex lights
- Cg per-pixel lighting with texture
- Cg per-pixel lighting with cookies
- Shader快速复习:Per Pixel Lighting(逐像素光照)
- Cg per-vertex lighting
- openGL CG3-Pixel Lighting
- Per Pixel Lighting [Part 4]
- 普瑞玛法则
- span层在DIV中设置高度
- epoll多线程
- 用Eclipse 创建web项目
- Per Pixel Lighting [Part 5]
- Per Pixel Lighting [Part 6]
- Per Pixel Lighting [Part 7]
- 面试题目6 编写类String的构造函数、拷贝构造函数、析构函数、赋值函数
- android-misc-widgets多方抽屉bug修复版 解决“闪烁”问题
- Android客户端与PC进行Socket通信
- (精)聪明的kk(动态规划)
- 程序人生感悟----做事和做人的思考之一201204
- SQL Server 2012 OFFSET/FETCH NEXT分页示例