最近做了兩個material,一個是OffsetMapping,這個大家應(yīng)該都很熟悉了,另一個是ReliefMapping,其實(shí)就只是OffsetMapping的精確版本,運(yùn)用光線追蹤計(jì)算出近似的交點(diǎn)而已。

OffsetMapping

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