真实快速的云渲染

发表于2015-10-28
评论0 3.2k浏览

真实快速的云渲染

Realistic and Fast Cloud Rendering

Niniane Wang

Microsoft Corporation (now at Google Inc.)

niniane@ofb.net

November 11, 2003

翻译:wesleyzhang

 

摘要

云是户外场景中很重要的元素。本文描述了一个基于粒子贴图片的云系统,来建模十二种不同类型的云(层云、浓积云、积雨云),相对于以前的只建模一种积云的系统是一个提高。我们同样也实现了快速的实时渲染,甚至适用于有浓密云层覆盖的场景,这对以前的系统是不太可能的。

我们展示了一个新的渲染模型,它是由美术师驱动控制,而不是一个程序方法来近似模拟光照。这个适用于那些需要精细控制的场合,且要有美术资源。我们同样介绍了一种用来模拟云的形成与消散的方法,它使用了基于粒子的贴图片(texturesplatted particles)。

1简介

云在模拟户外环境中扮演重要角色。逼真的云成为户外场景最为吸引人的图形组件之一,特别是对于诸如飞行器模拟和电影制作等模拟真实世界的应用。

在可交互的真实世界应用中,云系统必须要从任何摄像机位置看都非常真实,而且要处理一系列不同类型的云(如层云、浓积云、积雨云),还有像真实世界中一样的疏密性(稀疏、块状、重叠)。比如我们的云系统用到了游戏“微软模拟飞行2004:飞行世纪”中,玩家可以下载它的真实世界的天气来在游戏图像中看。对我们系统设计的要求是它必须要对所有的真实场景生成高质量的结果,从束状的层云到重叠的雷电天空。

为了能适用于交互性的应用,我们的系统必须要保持很高的性能。拿模拟飞行举例,该游戏要能在除了有云渲染之外,还有其它很多系统计算(诸如物理,AI、地形渲染)的情况下保持较高的帧率。因此我们云系统要保持在较低的毫秒级的渲染时间。除此之外,它在低端机上也要的好的效率,因为受硬件约束的用户基数很大

云的效果表现要受到太阳光和天空的影响,这些我们要在渲染的时候实现出来。我们系统的目标应用是那些对最终云表现有一个精确控制,并且有美术资源。这些应用可以是电影制作和电脑游戏等。

在真实的世界里面,云不是一直静止不动的。它们会在天空中穿梭,在有湿气和不稳定空气的区域形成,而当这些条件减弱的时候消散。为了模拟这样的变化,我们的云渲染方法必须要包含一个让云能够随时间变化自然的生成的消散的机制。

在本文中,我们展示一个可以解决上述问题的云渲染系统。我们使用基于粒子的纹理发射来创建云里面的“泡芙(puffs)”,这样就可以生成十二种不同类型的云,如雨层云(nimbostratus)、高积云(altocumulus),这对于以前只能生成一种积云的系统是一个提高。我们使用一个八角环的替代者(octagonalring of impostors)来实现高性能。即使对于有浓密云层的场景也没问题,而这个传统意义上一个挑战。为了近似模拟天空和阳光,我们使用了一个简单高效的渲染模型。最后,我们的方法可以让云动态的生存或消散。

第二章回顾了一下背景和以前的工作。第三章描述了我们的技术,第四章解释了云是怎么动态的生成和消散的,第五章介绍了渲染方法,第六章展示了性能对比,第七章描述了实验,算法极限以及未来的研究方向。

图1:日落时真实的云场景

2.以前的做法

(见原文)

3 云的建模

我们的云把每个云渲染成5400Alpha混合的纹理片(textured sprites)。每个片面向摄像机,一块组成一个三维体。我们根据它们距离摄像机的距离从后往前渲染。

3.1 云的创建过程

我们定义了创作过程来让美术师能够精细控制最终云模型的形状,它在编辑过程中有一个快速的视觉反馈。我们不选择那种用程序自动生成云模型的方法,因为根据我们的经验这种方法很难调出想要的效果。它要涉及到调整方程的参数,这些参数最终影响云模型的形态,但它们不能直接控制。我们的选择是需要美术师参与,而这个对于游戏和电影制作就是适用的。

我们写了一个3D Max的插件给美术师,美术师可以通过创建和旋转一系列的盒子来定义云的形状。当美术师按下我们插件UI上的一个按钮时,这个插件就会生成许多盒子,这些例子里面包含了随机放置的面片。见图3和图4。美术师可以控制面片的数量来生成稠密或是稀疏的云。他也可以指定面片高度和宽度的范围。在我们创建的云里面,大部分面片是正方形,尽管我们会使用一些宽而短的面片来创建朦胧区域,这些区域是被水平拉扯了。

一般每个16平方公里的云区域里面包含20200个盒子,根据密度每个盒子1100个面片。在UI上美术师可以指定前面提到的面片维度和密度,要使用的纹理和其它云的属性。

创建一系列随机放置的面片中心之后,这个插件遍历这个列表,去掉那些离其它面片超过一个阈值的面片。这个减少了最终渲染中的重绘。也减少了重叠的盒子产生的冗余面片。我们发现按面片高度的1/3剔除对于一般面片效果是比较好的,1/51/6的高度可能会产生浓密的云。

美术师编辑了云之后,他使用一个定制的导出工具来创建一个二进制文件。这个文件包含面片的中心位置,旋转,宽度,高度,纹理及渲染信息。这些文件会在游戏执行和渲染的时候加载。

图2:由面片组成的云

图3:3D Max中代表一个方形区域云的盒子

图4:运行脚本后,图3的盒子填充了许多纹理面片

3.2纹理

我们混合并匹配十六种纹理来产生十二种不同的云类型。其中三种可以在图5中看到。

16种纹理可以在图6中看到。它们包含32位,用于颜色和Alpha。右上角的底部扁平纹理用来创建底部扁平的积云。顶层的三种雾状纹理大多用在层云,这些有一点点蓝灰色。底部两层的蓬松纹理可以给积云带来有趣的变化。其它的六个束状面片会在所有的云类型中穿插使用。

通过在纹理里面创建有趣的像漩涡和丝状的纹理,我们就可以使用很少的面片来创建更加真实的云。我们通过把所有16张纹理放到一张512*512纹理表上来减少显存占用量。这个节省了不同绘制调用之间切换纹理的代价。合理使用显存对于运行着816兆字节的低端机一说非常重要。我们实现了明显更低的代价相对于其它对每个云都使用不同纹理的系统。

为了从这16个纹理生成更多的变化,美术师可以指定每个面片的旋转范围。当二进制文件载入游戏之后,每个面片就会在该范围内随机指定一个旋转角度。我们发现积云比较小的变化范围(-5--5度)而给其它面片全范围的旋转看起来最好。我们对于非正方形不进行旋转。

 

图5:场景展示了十种云里面的三种:低层的层云,中层的浓积云,高层的高积云

图6:云的面片纹理表

3.3 云中体验

我们的方法产生了一个自然的云中体验,感觉起来像是摄像机在云朵中穿梭。当摄像机穿过一个面片时,这个面片迅速从视野中消失。它生成了一个连续的云中体验,对比于那种产生跳变转换(jarring transition)的技术,这些技术会当玩家穿梭在云中时播放一个既定动画。

当我们第一次实现我们方案,我们让面片总是朝向摄像机,以便我们看不到它们的边缘。然而,在云中体验时,摄像机离面片中心太近,以至于微小的摄像机位移都会引起很大的面片旋转。这个导致了“离别的红海(parting of the Red Sea)”现象,面片都移出了摄像机过来的方向。

我们的解决方法是当摄像机到达面片半径一半以内时,锁定面片的角度。这个去除了红海现象,但产生了一个新问题。当摄像机移动接近面片时,导致面片被锁定,然后直到可以看到面片前作回转运动。我们做实验检测这种情况然后把面片转到一个新的角度。但是当玩家穿过面片时会引起明显的跳变。我们的方法是检测面片旋转的角度和到摄像机的向量,然后调整布片的透明度。这个产生了一个副作用就是使这部分的云透明度降低。

4.云的形成和消散

云的形成和消散给视觉体验增加了另一层的真实度。我们通过调整面片的透明度来控制云的演变。我们计算了一个透明度因子乘到每个顶点的渲染方程中。

我们基于面片的位置来计算面片的透明度因子。当一个云开始生成的时候,我们只渲染那些离云中心点小于云半径一点的面片,我们用一个高透明度级别来渲染,随着时间变化再递减它。当它们透明度达到一个阈值,我们开始渲染那些中心离云中心超过云半径的那些面片。

云的消散过程是通过模拟反向过程实现的。我们首先增加那些离云中心超过云半径的面片的透明度,当它们完成消失后,我们再增加半径以内的那些面片的透明度。这个顺序见图789

图7:消散前的云

图8:云的边缘正在淡出

图9:云几乎完全淡出

5.云渲染

以前对于云渲染的研究计算单个和多个对于云粒子的散射和反射。我们选择使用更简单的计算,它基于美术的设置,这些设置可以达到一个合理的近似效果。前面说的光照计算换来了更多的美术控制和更少的运行时计算。

在我们云的渲染系统中两个主要因素是天光和阳光。

5.1散射天光的近似

当从天空来的光线穿过云时,它们被云的面片散射和过滤。结果,云一般底部变暗。为了模拟这个,美术师使用3D Max中的颜色拾取器给每个云指定5个颜色层次。这个颜色层次包含了一个在云上的高度和对应的RGBA颜色值。这个颜色层次也是跟随云描述文件导出的。

美术师可以使用这个环境颜色层次来建模不同的云类型。他们把层云的颜色层次设置为淡灰,雨层云指定暗灰来表示不祥的表现。积雨云从上到下都是黑的,积云的云朵几乎是均匀的白色。美术师还可以调整Alpha值来生成一些透明度更高的云,诸如层云。

另外,对于一整天的不同时候段,美术师可以指定一个百分比乘到环境颜色层次上,这可以让环境的贡献值减慢黑夜的到来。在黄昏和黎明时时间点可以多采样一些。

在游戏执行并渲染云时,我们在把面片旋转让其朝向摄像机后,计算面片的4个角并且判断其是否离摄像机过近而锁定它。对于每个角的顶点,先取出其位置的垂直分量,用它来在垂直颜色层次表中插值得到一个RGBA颜色值。同时,把当时的时间在时间百分比表中插值得到一个百分比,把这个百分比乘到颜色值上就得到这个面片顶点在一天某个时间的环境颜色值。

指定一个顶点(Vx,Vy,Vz)在时间T,时间T0处颜色是CT0,时间T1处颜色是CT1,让AT=(T1-T)/(T1-T0),在颜色层次表中,V0处颜色为CV0V1处颜色为CV1,让AT=(V1-VY)/(V1-V0),然后环境光计算如下:

Camb= (AV _CV0 +(1–AV ) _CV1) _ (AT _CT0+(1–AT ) _CT1) (1)

 

图10:通过垂直方向的颜色层次进行环境渲染

5.2 阳光的近似

阳光直接照射到云上,会生成一些动态的场景,特别是在黎明和黄昏。我们会模拟这种当朝向太阳的区域接受更多的光照,而背向太阳的接受较少的光照。我们不模拟云向自身、其它云或其它物体的投影。

美术师要指定渲染组,当他们在3D Max中通过盒子来创建云时,1-30个面片的小组被作为一个渲染单元。对于每一个盒子,给其设置一个渲染组的序号,从这个盒子中生成的面片都属于这个渲染组。这个渲染组模拟云中的块。我们通过以下方式来计算一个顶点的方向光分量,先计算这个点到渲染组中心的向量,再计算渲染中心到太阳的分量,最后这两个向量归一化后算出其点乘结果。见图11.

我们想把点乘结果从范围[-11]映射到[Cmin,Cmax],偏置结果以便使[-10]映射到[Cmin,Cmedian],[0,1]映射到[Cmedian,Cmax].偏置的原因是为了避免在云层中间以下出现一个从亮到暗的急剧变化。映射函数的结果决定了这个顶点相对于最大方向光颜色的比例。颜色CminCmedian,Cmax由美术师确定。

美术师要指定一天的不同时间方向光的颜色,然后我们对于一天的某个时间点,插值得到这个点处的最大方向光颜色值。我们再把上述计算得到的比例乘到这个颜色值上。

对一个顶点,给定一个时间点T,时间T0处颜色为CT0,时间T1处颜色为CT1,令AT=(T1 - T)/(T1 - T0),如果VVC定义为该顶点到云中心向量归一化后的值,VCS是云中心到太阳的向量归一化后的值,那么方向光的颜色通过下列方式计算:

Cdir= mapping func(VvcVcs) _ (AT _CT0 +(1–AT ) _CT1) (2)

5.3 结合两种结果

为了得到最终的顶点颜色,我们把环境光和方向光的颜色加到面片纹理上。此时,我们还要乘上代表生成和消散的Alpha(Alphamorph)

Cvertex= (Camb+Cdir) _Ctexture_Alphamorph(3)

图11:方向光渲染

6.性能

为了能在实时系统中使用,我们的系统必须要达到很快的性能,它使用在游戏“飞行模拟器2004”。它在普通的PC机上要达到15-60帧,包括物理,AI和其它的渲染计算。在该游戏中,我们要在5-40毫秒内渲染100公里半径的浓密的积雨云。额外的要求是在带有老式显卡的低端机上保持一个高的帧率,因为这种机器占了很大一部分比例。

6.1缓存顶点计算

由于面片要面向摄像机,因此摄像机位置的变化都会引起每个面片顶点的重新计算,随之环境光和直射光的颜色值也要重新计算。计算一个包含500个云的场景要花费3毫秒。

我们通过缓存计算来减轻这种代价,只在时间或摄像机的位置变化到一个阈值时才重新计算。这些阈值是基于云到摄像机的距离的,因为旋转的变化对近处的面片会非常明显。我们调整这个阈值,使其不会引起视觉上的跳变。在云的生成和消散时同样要增加它的重新计算频率。

6.2 使用“替代者(Impostors)”来减少重绘

云的大量重绘使其有机会被优化,提高效率。我们使用了“替代者”技术来动态地把多个云绘制到一张贴图上,该贴图再以公告板的形式来展示。这个减少了三角形的重绘。

我们创建了一个由纹理环绕的八角环,每个纹理都是45度的视角。我们可以将上百个云渲染到一个“替代者“上。我们的系统比较16平方公里的云和这个环的半径,只把半径以外的云渲染到”替代者“上,半径以内的云被按照面片来渲染。这个减少了显存,因为要使用云来实现跟“替代者”同样的效果需求更多的纹理。

我们的系统允许用户来设置这个环的半径。这需要一个权衡,更小半径的环会把更多的云渲染到“替代者”上。这可以大大提高帧率,但会有更严重的视觉异常。更大的环半径意味着从“替代者”获得的性能提高变少,因为更少的云渲染上去,但是它的视觉异常也比较少,并且“替代者”可以不用太频繁的更新。

我们把这个八个“替代者”绘制在固定的世界坐标上,让它们朝向环中心。然后当摄像机或太阳的位置变化超过一个阈值时重新计算它们。我们重新计算所有八个“替代者”而不是一个偷懒的计算,以便在摄像机的旋转有一个快速变化时“替代者”是可用的。根据经验发现用户水平移动环半径的15%或垂直移动环半径的2%时就要重新计算“替代者”。

为了防止由于渲染“替代者”而带了帧率变化,我们把“替代者”的计算分到多帧里面去。对于直接支持它的显卡,我们做了一个硬件的“渲染到纹理”间隔八帧把一个“替代者”渲染到一张带有Alpha的纹理上面。对于其它的显卡,我们使用软件光栅化(software rasterizer)间隔把其渲染到一张纹理上。当我们更新一组新的“替代者”时,我们会在前后两组之间做渐变处理。

我们基于云和摄像机之间的角度来垂直的向上或向下转换“替换者”的纹理。当云相对于摄像机垂直偏移10000英尺时,我们就不会把其渲染到“替代者”上,因为视角太尖锐了。在这种情况下云已经太远了且在屏幕上只占了很小的空间。所以它会有更少的重绘和性能消耗,唯一不好的就是它没有被绘制到“替代者”上面。

由于显存平常都是紧缺资源在消费者的PC上,所以我们设计的“替代者”只占用了很少的显存。我们八角环的“替代者”,纹理大小为256*25632位颜色,加起来占用的显存为8*256*256*4= 2M。当渐变时,两个环都要渲染,所以在此时还要占用2M的显存。

图12:渲染云到一个“替代者”上

图13:摄像机周围的“替代者”环。环里面的云按3D渲染。

6.3 性能结果

我们的云系统是使用DirectX APIWindows系统上实现的。我们发现它的帧率跟面片的数量和大小相关。我们创建了一个衡量标准叫做“云块重绘”,它把整个16平方公里的云块的所有布片的大小加起来,然后用这个块的二维面积除。

我们在微软飞行模拟器游戏中运行了三个场景:重绘率是170%的稀疏云,重绘率真是200%的零散云,以及重绘率是475%的重叠云。我们运行每个场景,没有用“替代者”,屏幕分辨率是1024*76832位色。

15展示了结果图像。我们可以看到,“替代者”在低端机上大幅提高的性能,比好机器提高要多,好机器上填充率不是其限制因素。在两种机器上,我们使用“替代者”可以达到15-60帧,即使在重叠的场景也能达到高帧率。从传统角度来说这对性能已经是一个挑战了。图14展示了重叠场景的一个截屏。

图14:天空中浓密重叠的云

图15 在两个系统上,有无“替代者”的性能对比表

7 限制和扩展

我们把这部分分成云的建模,动画和渲染,性能以及其它的视觉方面的扩展。

7.1 建模

我们的系统十分适合创建体积云,但不太适合创建比较平的云。对于这四种基本的云类型-层云,积云,积雨云,卷云(cumulus, stratus, cumulonimbus, and cirrus),我们的系统可以轻松处理前三种,但是对于第四种卷云很难处理,因为它很平几乎是二维的。为了把卷云复制我们的系统,我们需要很大数量的面片,这会带来很大的性能消耗。其实,我们在系统中是用平的带纹理的矩形来表示卷云的。

由于每一朵云的面片是按照从摄像机的距离从后往前排序的,移动摄像机有时因为面片调换绘制顺序而出现跳变。这个在黎明和黄昏时特别明显,这时方向光的渲染占的比重比较大。一个可能的解决方案是把以前的绘制顺序保存下来,当面片之间顺序变化时过渡一下。在我们的实验中,跳变的不是很厉害,所以还不需要这个方案。

我们在云里面的体验有时感觉没有想像的那么浓密。有一个场景是当玩家穿过只含有几个云片的稀疏的云,当摄像机在云的中心,只有一半的面片在摄像机的前面,所以云只有一半的透明度相对于从云外面看。然后,现实中云最里面才是看起来最密的。

另一种在云里面看起来云不是很密的情况是当玩家变化摄像机的旋转角度时。假使玩家在沿地面平行的方向飞行。当他飞的离云面片非常近的时候,面片会按垂直于地面的方向锁定。如果这时候玩家往下看,他会看到云面片之间的间隙。一个可能的方案是检测当玩家进入到云中心时,加一个额外的雾效到整个云效果里面。

7.2 动画的渲染

现在云是不改变形状的,除了生成和消散时。在现在生活中,空气的流动会使云随着时间产生形变。我们可以通过旋转和飘散云里面的面片来模拟这个效果,给人一种丝丝的云朵随风飘动并且翻动的印象。由于面片是分开的,所以云可以凝结或者分开成几个小块。我们也可以渐变各个面片来调整整个云的形状。

由于我们的渲染云模型不模拟光的散射,所以云不会对自身或对相邻的云投影。另一个渲染不准确的地方是,方向光渲染是基于到太阳的角度而不是光穿过云块时云块的密度。例如,当云在太阳和摄像机之间时我们不能得到光晕的效果。一个可能的解决方案是对一系列光的方向进行光照和云投影区域的预计算。我们可以在运行加载这些信息,并根据太阳的角度进行插值。

7.3 性能

重绘占用了很多渲染云的代价,所以帧率会根据场景中云的多少而变化。当摄像机进入一块云时重绘比例会升高,而帧率会降低。一个缓解的方法是检测当摄像机进入一个云地,使用面片的包围盒,并且加入一些雾效。这可以让我们少绘制一些云。

使用“替代者”环可能会产生视觉上的不正确。假使在“替代者”环外面一个座被云环绕的山,这些云被绘制在单一的“替代者”上,山必须在所有云之前或之后来绘制,而不是一些云之前而在一些云之后。这个可以通过加入多个“替代者”环来缓解,但是会增加显存的使用。

由于缺少视差,“替代者”也会看起来不正确,在“替代者”上的云不会相对彼此移动。它们的运动相对于在“替代者”内部那些被单独渲染的面片也是不准确的。

未来工作的一方面是利用新的硬件来使用顶点Shader来实现一些技术。我们还没做是因为我们程序的用户有各种不同的机器,这些机器很多都不支持硬件的顶点Shader

7.4 其它视觉效果的扩展

我们的系统可以扩展到其它的气态现象,比如雾,烟和火。

雾是很自然的候选对象,因为它实际上就是接口地面的层云。有一个问题就是当面片与地面网格相交时会产生硬边,这个可通过沿着地面分割或者基于高度乘以一个Alpha贴图来缓解。

为了让我们的系统可以模拟烟,我们可以使用颜色暗一些,更轻盈一些面片。由于烟比云要更易快速移动,我们可能需要加强它的运动,其实可以加入一些空气流动模拟进去。

 

参考文献

[Bli82] J Blinn. Light reflection functions for simulation of clouds and dustysurfaces. In Computer Graphics (Proceedings of ACM SIGGRAPH 82),Computer Graphics Proceedings, Annual Conference Series, pages 21–29.ACM, ACM Press / ACM SIGGRAPH, 1982.

[DKY+00] Y Dobashi, K Kaneda, H Yamashita, T Okita, and T Nishita. A simple,efficient method for realistic animation of clouds. In Proceedings of ACMSIGGRAPH 2000, Computer Graphics Proceedings, Annual ConferenceSeries, pages 19–28. ACM, ACM Press / ACM SIGGRAPH, 2000.

[DNYO99] Y Dobashi, T Nishita, H Yamashita, and T Okita.Using metaballs tomodeling and animate clouds from satellite images. 15(9):471–492, 1999.

[Ebe97] D S Ebert. Volumetric modeling with implicit functions: A cloud is born.InVisual Proceedings of ACM SIGGRAPH 1997, Computer Graphics Proceedings,Annual Conference Series, page 147. ACM, ACM Press / ACMSIGGRAPH, 1997.

[ES00] P Elinas and W Stuerzlinger.Real-time rendering of 3d clouds.Journalof Graphics Tools, 5(4):33–45, 2000.

[Har03] Mark Harris. Real-Time Cloud Simulation and Rendering.PhD thesis,University of North Carolina at Chapel Hill, 2003.

[HL01] M Harris and ALastra. Real-time cloud rendering. In Computer GraphicsForum, volume 20, pages 76–84. Blackwell Publishers, 2001.

[NDN96] T Nishita, Y Dobashi, and E Nakamae.Display of clouds taking into accountmultipleanisotropic scattering and sky light. In Proceedings of ACMSIGGRAPH 96, Computer Graphics Proceedings, Annual Conference Series,pages 379–386. ACM, ACM Press / ACM SIGGRAPH, 1996.

[Per85] K Perlin.An image synthesizer. In Computer Graphics (Proceedings ofACM SIGGRAPH 85), Computer Graphics Proceedings, Annual ConferenceSeries, pages 287–296.ACM, ACMPress / ACMSIGGRAPH, 1985.

[Sch95] G Schaufler.Dynamically generated imposters.In Modeling VirtualWorlds - Distributed Graphics, MVD Workshop, pages 129–136, 1995.

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引