【ZZ】 移位贴图 Displacement Mapping

时间:2021-01-30 17:38:08

http://blog.csdn.net/huazai434/article/details/5650629

说明:该技术需要VS3.0的支持!!!

一,移位贴图类似于地形渲染。不过由于移位纹理可以做成动态的,因此,该技术可以用来模拟波涛滚滚,起伏不平的海面。

二,类似于法线贴图,移位贴图的每一个纹素中存储了一个向量,这个向量代表了对应顶点的位移。

注意,此处的纹素并不是与像素一一对应,而是与顶点一一对应,因此,纹理的纹素个数与网格的顶点个数是相等的。

在VS阶段,获取每个顶点对应的纹素中的位移向量,(注意,直到3.0版本的vs才支持纹理数据的获取,之前的版本只有ps才能获取纹理数据),施加到局部坐标系下的顶点上,然后进行世界视点投影变换即可。

三,纹理过滤的实现。

之所以补充这一点,是因为某些版本的显卡vs支持的纹理格式有限,而这些种类的纹理格式并不支持纹理过滤,因此我们需要在vs中手动进行纹理过滤。纹理过滤的基本思路如下:

假设点P(x,z)对应的纹理坐标是(117.76,34.13),但是纹素的坐标只能是整数类型的,那么P点对应的应该是哪一个纹素呢?(117,34)?还是(118,35)?实际上,我们需要对如下的四个点:(117,34) (117,35)  (118,34) (118,35)进行采样,并对四个样本值进行加权平均,最终得到的值便是过滤后的纹理值。具体算法实现如下:

// Transform to texel space
    float2 texelpos = DMAP_SIZE * texC0;
        
    // Determine the lerp amounts.           
    float2 lerps = frac(texelpos);
    
 float dmap0[4];
 dmap0[0] = tex2Dlod(DMapS0, float4(texC0, 0.0f, 0.0f)).r;
 dmap0[1] = tex2Dlod(DMapS0, float4(texC0, 0.0f, 0.0f)+float4(DMAP_DX, 0.0f, 0.0f, 0.0f)).r;
 dmap0[2] = tex2Dlod(DMapS0, float4(texC0, 0.0f, 0.0f)+float4(0.0f, DMAP_DX, 0.0f, 0.0f)).r;
 dmap0[3] = tex2Dlod(DMapS0, float4(texC0, 0.0f, 0.0f)+float4(DMAP_DX, DMAP_DX, 0.0f, 0.0f)).r;
 
 // Filter displacement map:
 float h0 = lerp( lerp( dmap0[0], dmap0[1], lerps.x ),
                     lerp( dmap0[2], dmap0[3], lerps.x ),
                     lerps.y );

http://blog.csdn.net/pizzazhang/article/details/7391879

分类: 计算机图形2012-03-25 11:52 367人阅读 评论(0) 收藏 举报

来源: http://www.nvidia.cn/object/tessellation_cn.html

随着最近人们对DirectX 11的议论纷纷,你可能已经听说了有关DirectX 11最大新特性Tessellation(曲面细分)的大量介绍。作为一个概念,Tessellation(曲面细分)非常直截了当,就是处理一个多边形分成诸多小碎片。但是为什么这样的处理方式能够备受瞩目呢?它是如何帮助提升游戏画质的呢?本文中,我们将分析Tessellation(曲面细分)之所以能够为PC 3D图形带来深刻变革的原因,并阐释一下NVIDIA®(英伟达™)GeForce®(精视™)GTX 400系列GPU如何提供突破性的Tessellation(曲面细分)性能。

从本质上来讲,Tessellation(曲面细分)是一种将多边形分解成更加细小的碎片以提升几何逼真度的方法。例如,如果处理一个正方形并将其沿对角线切开,那么实际上就是将这一正方形“曲面细分”成为两个三角形。就其本身而言,Tessellation(曲面细分)并不能提升半点逼真度。例如,在游戏中,一个正方形被渲染成为两个三角形还是两千个三角形都是无关紧要的。只有在使用新三角形来描述新信息时,Tessellation(曲面细分)才能提升逼真度。

【ZZ】 移位贴图 Displacement Mapping 【ZZ】 移位贴图 Displacement Mapping
当一个置换贴图(左)应用到平面上时,所生成的表面(右)就会表现出置换贴图中所编码的高度信息。

运用新三角形最简单、最流行的方式就是有“Displacement Mapping(贴图置换)”之称的技术。置换的贴图就是一个存储高度信息的纹理。当应用到某一表面上时,该贴图让这一表面的顶点能够根据高度信息调高或调低。 例如,使用一块大理石板,图形艺术家能够通过“置换”顶点的方法打造雕刻效果。另一种流行技术是将置换的贴图应用到地形上,以雕琢出弹坑、峡谷以及山峰。

正如Tessellation(曲面细分)一样,Displacement Mapping(贴图置换)已经存在很长一段时间了。但是直到最近,它才真正流行起来。究其原因,是因为想要让Displacement Mapping(贴图置换)有效,表面必须由大量顶点构成才行。以大理石雕刻为例,如果大理石块由八个顶点构成,那么在它们之间便没有可以生成龙形浮雕的相对置换量了。只有在基础网格中具备足够多的顶点用以描绘新形状时才能够生成细致的浮雕。从本质上来讲,Displacement Mapping(贴图置换)需要Tessellation(曲面细分),反之亦然。

随着DirectX 11的问世,Tessellation(曲面细分)与Displacement Mapping(贴图置换)终于实现了珠联璧合,广大开发商已经加入到这一阵营当中。像《Alien vs. Predator》以及《地铁2033》这样的流行游戏均采用了Tessellation(曲面细分)来生成外观平滑的模型,而开发商Valve公司与id Software已经完成了一些前景看好的工作,将这些技术应用到其现有的游戏人物身上。

【ZZ】 移位贴图 Displacement Mapping
当一个粗糙的模型(左)经过Tessellation(曲面细分)处理后,就会生成平滑的模型(中间)。当应用了贴图置换之后(右),游戏人物便接近电影般的逼真度了。 © Kenneth Scott、id Software版权所有。2008

因为DirectX 11 Tessellation(曲面细分)流水线是可编程的,因此可以用它来解决大量图形问题。让我们来看一看四个实例。

完美凹凸贴图

【ZZ】 移位贴图 Displacement Mapping

从本质上来讲,Displacement Mapping(贴图置换)可被用作现有凹凸贴图技术的临时替代技术。例如法线贴图等当前的技术通过更佳的像素渲染,能够创造出凹凸表面的假象。所有这些技术都只在特定情况下有效,并且在其起效时并不是全都那么逼真。下面以凹凸贴图中较为先进的视差遮蔽贴图为例进行说明。虽然它能够生成重叠的几何假象,但是它只能在平面上以及物体内部起作用(见上图)。真正的Displacement Mapping(贴图置换)不存在这些问题,能够从所有视角生成精确的结果。

更加平滑的人物

【ZZ】 移位贴图 Displacement Mapping
无需艺术家手工输入,PN-Triangles可实现游戏人物的自动平滑。几何与光照逼真度均能够得到提升。

细化算法是Tessellation(曲面细分)的另一个自然搭档。细化算法可处理粗糙模型,借助于Tessellation(曲面细分),该算法可创建外观更加平滑的模型。PN-Triangles(也称作N-patches)就是一个流行的实例。PN-Triangles算法能够将低分辨率模型转化为弯曲表面,该表面然后可以被重新绘制成由“高精曲面细分”的三角形所组成的网格。在当今游戏中,我们认为理所当然的大量视觉假象都可以借助此类算法来消除。这些视觉假象包括人物关节处呈现块状图案、汽车*呈多边形外观以及面部特征粗糙。例如,《Stalker: Call of Pripyat》中就使用了PN-Triangles来生成外表更平滑、更自然的人物。

无缝的精细度

在具有大型、开放式环境的游戏当中,用户可能会注意到,远处的物体经常会时而出现、时而消失无。这是由于游戏引擎正在不同精细度(LOD)之间进行切换,以限制几何工作负荷。因为需要为同一模型或环境保存多个版本的数据,所以直到那个时候,都还没有一种简单的方法能够连续改变精细度。动态Tessellation(曲面细分)通过即时改变精细度,解决了这一问题。例如,当远处的建筑物首次映入眼帘时,也许仅使用10个三角形来渲染它。随着用户视野的拉近,该建筑物的显著特征开始浮现,更多三角形则被用来描绘窗子和屋顶等细节。当你最终到达门口时,单单旧式铜质门把手一项就动用了一千个三角形来进行渲染;Displacement Mapping(贴图置换)细致地雕刻出了每一道凹槽。由于消除了动态Tessellation(曲面细分)对象的时隐时现,因此游戏环境现在可以扩展至几乎无限的几何精细度。

收放自如的艺术品

对开发商来说,Tessellation(曲面细分)大幅提升了其内容创作流水线的效率。在描述其使用Tessellation(曲面细分)的动机时,Valve公司的Jason Mitchell表示:“我们对能够编辑游戏内容这一点很感兴趣,因为这样就让我们能够实现缩放了。也就是说,我们想要只制作一次模型,然后便能够将其提升至电影画质…反之,我们想要能够自然地降低游戏内容的画质,以满足在特定系统上实现实时渲染的需要。”这种仅创建一次模型便可在各种平台上使用的能力意味着缩短了开发时间。对PC游戏玩家来说,这意味着在其GPU上能够实现最高的图像画质。

GeForce®(精视™)GTX 400 GPU(图形处理器)如何处理Tessellation(曲面细分)

传统的GPU(图形处理器)设计采用单个几何引擎来执行Tessellation(曲面细分)任务。这种方法是类似早期的GPU设计,此类设计均使用利用单个像素流水线来执行像素着色。在认识到像素流水线是如何从一个单元发展为多个并行单元以及这一进展是如何在3D逼真度方面大放异彩之后,我们便从一开始就设计了自己的并行Tessellation(曲面细分)架构。

GeForce®(精视™)GTX 400 GPU(图形处理器)拥有最多15个Tessellation(曲面细分)单元,每一个单元都具备针对顶点拾取、Tessellation(曲面细分)以及坐标变换的专用硬件。它们利用4个并行光栅引擎来进行运算,这些引擎可将新近曲面细分的三角形转换成精细像素流以便用于着色。这样一来,Tessellation(曲面细分)的性能便实现了巨大突破,持久性能达每秒16亿三角形以上。与最快的同类产品相比,GeForce®(精视™)GTX 480的速度最高可达7.8倍。这一数据由独立网站Bjorn3D所测得。

结语

经过多年的反复试验,Tessellation(曲面细分)终于在PC上获得了成功。《地铁2033》等优秀游戏已经展现了Tessellation(曲面细分)的潜力。最终,Tessellation(曲面细分)将成为同像素着色一样关键、一样必不可少的技术。由于意识到了Tessellation(曲面细分)的重要性,NVIDIA®(英伟达™)公司从一开始便打造并行Tessellation(曲面细分)架构,推动这一进程。成果就是GeForce®(精视™)GTX 400系列GPU(图形处理器)—几何逼真度与Tessellation(曲面细分)性能的真正突破。

Rhino4 的Displacement mapping置换贴图

07.11.2010, Rhino Labs, by admin.

【ZZ】 移位贴图 Displacement Mapping
来源于 Rhino Labs Jessesn整理,如需转载,请注明出处.
__________________________________________________________________________________________
Displacement mapping(置换贴图) 和 (bump mapping)位图贴图几何学上非常接近,允许你根据纹理贴图的灰度的数据定义Meshs(无论是mesh对象还是render-meshes)的大小. 置换插件需要RDK插件的支持才可以正常的使用,如果你安装了RDK的话,仅仅只需要下载置换插件就可以,否则是不能正确导入这个插件的.
下载  displacement.zip (79.59 KB)
Displacement mapping(置换贴图)插件
这个版本的需求RDK BETA6的版本支持(下载 RDK BETA6)
____________________________________________________________________________________________ 

如何使用

1 首先运行一个并没有过置换设置的对象,所有的置换属性都是在物体的属性的Displacement栏对话框中

显示,如下图
【ZZ】 移位贴图 Displacement Mapping

2 每个对象都需要独立的开启置换功能,意味着你可以快速的开启和关闭置换功能而不会丢失你的设置,一

旦你开启了兑现的置换贴图并且指定了一个纹理贴图(下面的演示是一个标准的RDK的程序纹理贴图),就

可以在视窗中看到置换的效果,如下图
【ZZ】 移位贴图 Displacement Mapping

3 你可以输入一个更高的Amount值来增加置换的效果,这数值表明一个白色象素点点将被偏移单的单位数
量,黑色的象素是不会有偏移的,灰度的象数就介于黑白象素之间按内插值的大小来觉得偏移量.
【ZZ】 移位贴图 Displacement Mapping

4 置换是和每个对象的纹理贴图属性息息相关的,只要我给一个polysurface启动置换功能,那么这个
polysurface的每个面都会有各自的纹理贴图的范围,置换的结果是所有的面块的偏移,当我对一个球面
(内定是每一个面)忽略纹理贴图,相邻的面之间并没有UV的跳跃而且这个效果将会变得很顺滑,尽管通过
球面的seam(逢合线)时候仍然会有一些UV的跳跃.
【ZZ】 移位贴图 Displacement Mapping

想要更多的调试效果,需要调用Advanced controls项,Advanced controls项提供一个设置置换运算主设置
的界面,例如 offsets, subdivision 与 iteration.
例如,Advanced controls可以让用户对黑白象素设置不同的便移数值,如下图
【ZZ】 移位贴图 Displacement Mapping

【ZZ】 移位贴图 Displacement Mapping

Ignore creases 选项可以让物体在置换前就完整的焊接好mesh,意味着polysurface的边线的UV变动会呈
现的比较小,对于莫认的设置当有需要时可以在置换前给一个更高的数值,不点这个项就可以关闭细分值,
意味着置换的mseh讲会和原始的mesh数值相同.
【ZZ】 移位贴图 Displacement Mapping

看下开起subdivision(细分)时的效果
【ZZ】 移位贴图 Displacement Mapping

Mesh的每个三角面是用来看是否超过可以偏移的极限(较低的值得到是较少的细分)如果超过的话则会被三
个更小的三角面代替,Max steps用来设置重复处理的次数,注意设置较低的Contrast值或是较高的Max
steps值都会造成长的运算时间.
【ZZ】 移位贴图 Displacement Mapping
【ZZ】 移位贴图 Displacement Mapping
了解更详细的资料请参考原RhinoLabs文件

【Shaper3d 】论坛原创教程,如需转载,请注明作者于来源