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

OffsetMapping

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