首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 比较OffsetMapping和ReliefMapping
【标  题】:比较OffsetMapping和ReliefMapping
【关键字】:OffsetMapping,ReliefMapping
【来  源】:http://www.cppblog.com/darkdestiny/archive/2006/06/08/8306.html

比较OffsetMapping和ReliefMapping

最近做了两个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是完全浮点数指令集的。
不完美的世界-看到了IOC工具的又一个发展方向:【上一篇】
std::ostringstream::str()返回临时对象:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 使用ActiveReports for .net 进行报表开发(十一)--迁移到3.0
  • linux帐户管理
  • 如何治疗红血丝、红血丝治疗应及早彻底消除红血丝,圣美安让你做个无红白美人。
  • 《给初学者的Windows Vista的补遗手册》之075
  • Flash版歌词秀
  • 浅谈SCA
  • 红包的故事 update
  • 让你同时上传 1000 个文件 (二)
  • Downloader木马:绑架你的浏览器
  • Painter 8 Script脚本(3)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.