随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 301918
  • 排名 - 84

最新评论

阅读排行榜

最近做了两个material,一个是OffsetMapping,这个大家应该都很熟悉了,另一个是ReliefMapping,其实就只是OffsetMapping的精确版本,运用光线追踪计算出近似的交点而已。
OffsetMapping.jpg
OffsetMapping

ReliefMapping.jpg
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 阅读(1216) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理