Clayman的专栏

It's all about XNA & GPU Programming

用户操作
[即时聊天] [发私信] [加为好友]
孙凌峰ID:soilwork
191780次访问,排名382好友0人,关注者12
soilwork的文章
原创 85 篇
翻译 15 篇
转载 0 篇
评论 329 篇
clayman的公告
嘿嘿 ^o^....
最近评论
jym5596337:我也不知道我怎么就走到了你的路上来了呵呵...
太晕了,我们专业就学的C#... 那我就凑合着用它学习MDX喽,但到了2008你的这个时期,感觉形式有点尴尬,以前的人说 在中国搞软件是 前有微软,后有盗版。
现在是 前有XNA后有C++ ... MDX 学习资料太太太难找了。。太太太少了。 师兄给介绍下你学历路途中的资料目录咯。。。我好找来学习咯。。 感谢哦感谢。。
jym5596337:好象没有继续哇 ...
shapin:ATI的网站有个支持HLSL语法高亮的vs插件,可以支持其他版本,只要修改相应的那个注册表就行
flip:To linxv :
貼圖座標有用投影嗎?
linxv:我用了你上面的基本技术,确实实现了纹理扰动,非常感谢!但是有一个问题是那张被扰动的图会跟着摄象机动,不知道是什么原因!
文章分类
收藏
    相册
    blogs
    David Weller
    nVidia Developer blog
    Rico Mariani
    Shawn Hargreaves
    XNA Team blog
    XNA资源
    XNA Creators Club
    ZBuffer
    Ziggyware XNA Resources
    中国XNA开发网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Parallax Mapping收藏

    新一篇: 美工 vs. 程序 | 旧一篇: 《The Complete Effect and HLSL Guide》翻译连载(九)

    请勿转载.

    clayman
    Blog:
    http://blog.csdn.net/soilwork
    clayman_joe@yahoo.com.cn  

      

       作为实现bump map的技术之一,Parallax Mapping(视差映射)的目的同样也是让平坦表面实现凹凸效果。和Normal Mapping相比,Parallax Mapping能实现更加真实和强烈的凹凸感。

     

    Parallax Mapping的思想:

           对真正高度起伏不同的凹凸表面来说,当观察它时会出现视差效果,但用平坦面表来模拟这种凹凸效果时,这种视差效果就消失了。上图中,点A对应的像素元为Ta,点B对应的为Tb。假设我们从上图所示的eye位置观察表明,对普通的纹理映射来说,应为观察矢量穿过了像素元Ta,所以我们应该看到A点。可是,观察矢量同样穿过了真实表面的B点。在实际生活中,我们观察的结果应该是看到点B,也就是看到像素元Tb。因此,对平坦表明来说,为了正确的显示点B,我们必须对Ta处的纹理坐标进行偏移,使它等于Tb。如果我们对多边形中的每个像素都进行这样的计算,视差效果也就出现了。

     

    需要的数据:

           除了渲染表面所需的纹理,法线等贴图之外,为了计算像素的纹理坐标偏移值,还需要表面的高度图。当然,还需要从每个象素指向观察点的矢量。由于最终的结果是用来修改纹理坐标,所以所有的计算都在切线空间下计算。这里,需要把世界坐标下的观察矢量变换到切空间下,因此对每个顶点来说都要一个切空间坐标变换矩阵。

     

    算法:

           在一般的纹理映射中,每个顶点都包含一对纹理坐标。在parallax mapping中,我们将用纹理坐标对高度图进行查找,根据所得结果对自身进行修改,最后再进行普通的纹理查找。如上图所示,纹理坐标偏移值等于点A到观察矢量的距离offset。由于从点A到观察矢量的射线和观察矢量的交点不一定在真正的几何体凹凸表面,所以parallax mapping上只是一种近似实现视差的方法。当然,可以使用其它方法获得更精确的偏移值,但这通常需要许多额外的计算,实际上在大多数情况下,这种近似已经足够好了。为了计算偏移,先要对切空间下的观察矢量进行标准化(normalized)。在切空间下,xy轴都位于切平面上V{x,y}z轴于切平面正交V{z}。接下来需要对高度图中的值进行缩放和偏移。高度图中的值在[01]之间,一般来说,需要把这个值映射到一个合适的范围内。比如对边长为2m的砖墙来说,假设表面水泥的厚度为0.02m,那么相应的缩放值应该为 0.02 / 2 = 0.01。此外,偏移值为0,那么水泥看起来是凸起的,如果为-0.01,则看起来是凹陷的。用以下公式来计算高度:

    Hsb = h * s+ b

           最终,修改之后的纹理坐标就为:

    Tb = Ta + V{x,y} * Hsb/ V{z}

          

        上面的公式虽然看起来是很合理的,但却有一些重要缺陷。当观察矢量和平面间的角度趋近于0时,Vz也趋近于0,结果将导致坐标偏移变的无限大,让parallax mapping方法崩溃。为了避免这种效果,只需要丢弃公式中的Vz项就可以了。当然,这同样会在精度上带来一些损失,不过实际情况下,一般不容易察觉出这些效果。

    Tb = Ta + (V{x,y} * Hsb)

     

    发表于 @ 2006年12月22日 01:48:00|评论(loading...)|编辑

    新一篇: 美工 vs. 程序 | 旧一篇: 《The Complete Effect and HLSL Guide》翻译连载(九)

    评论

    #dongxue.gpp 发表于2007-03-28 21:28:19  IP: 221.197.41.*
    到是种好的方法。而且正确。
    就是公式中的符号,不知道表示什么?
    有点影响理解。
    谢了
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © clayman