最近做了兩個material,一個是OffsetMapping,這個大家應該都很熟悉了,另一個是ReliefMapping,其實就只是OffsetMapping的精確版本,運用光線追蹤計算出近似的交點而已。

OffsetMapping

ReliefMapping
比較結果:(上面的技術分別簡稱OM,RM)
效率。OM很快,因為OM計算紋理偏移只是簡單的把當前點的高度乘以觀察方向就夠了,但是RM不是,RM需要在一個循環內逐個高度的測試,看所測試的高度是否接近相交點的高度。OM只需要兩次紋理尋址,而RM需要6次(效果一般般)以上。由此使得RM的效率實在不能恭維。
視覺效果。上圖兩者使用的細節高度是0.05,咋一看,似乎OM的效果比RM還有凸出感,但是事實上,磚塊之間的間隙在OM圖中實在太寬闊了點(實際不是這樣子的),所以它顯得比較凸出。RM的效果肯定更好。
細節上的最大高度。OM的最大高度很小,且一旦超過了那個值,渲染效果就很古怪了,RM要比它大的太多了。而且RM的優勢就是,越大的細節高度,就越能體現凸出感,這點是OM所沒有的。
總結:
優化。如果用RM,一定要有效率,那么循環次數就要盡可能的小,但是越大的步長,所能支持的細節高度就越小,所以,盡可能根據細節高度選擇最小的循環次數。
如何計算細節最大高度。計算紋理偏移不能僅僅是高度圖上的高度乘以觀察方向就可以的,這樣做會讓畫面很亂,一定還要乘以一個縮放比例,其具體意義就是細節高度。舉個例子說明吧。在我的渲染中,墻壁的邊長是50cm,映射的紋理坐標是[0,1],比值50:1。現在希望墻壁那些該凸出的地方的最大凸出高度是3cm,那么映射到紋理中是x,比值3:x。50:1 = 3:x,計算出x=0.06。
shader中的整數和浮點數。被這個細節玩弄了好久。1/9=0,1.0/9.0 = 0.xxx。之前在RM的循環中每次步長的增值是1/9,結果一直沒做好渲染,后來認為是整數除法和浮點數除法的區別之后,才更正。唉,一直以為shader是完全浮點數指令集的。
PS:RM是可以做自陰影效果的,不過開銷。。。。別指望了。
posted on 2006-06-08 22:04
LOGOS 閱讀(1225)
評論(0) 編輯 收藏 引用