美丽的喷泉

2024-05-19

美丽的喷泉(精选四篇)

美丽的喷泉 篇1

连续几天卫生间的地面、墙上总是湿的,而且班上的生活老师也说肥皂盒里的肥皂总是用得特别快, 没几天肥皂就没有了,而且常发现肥皂碎块掉在水池里。这到底是怎么回事? 询问幼儿,他们都说不知道。于是,我决定要查个水落石出。因此,我特别关注幼儿进入卫生间的过程。一天上午,我在活动室里忙了一会后,悄悄地走到卫生间,看见黎俊熙小朋友两手靠近开着的水龙头口, 水龙头里的水一下子冒出来,溅到了墙上、地面上,然后他两只手握着肥皂使劲儿地搓呀,挤呀,搓完双手又放在水龙头上,水又溅到了墙上、地面上……看到这儿,我心中不由升起了一股怒火,但是我又一想,我不能这么着急、冲动,先听听他自己怎么说。我走到他身边,用平和的语气问:“黎俊熙,你在做什么? ”他显得有些紧张,眼睛直盯着我,双手立刻放了下来。看着他紧张的样子,我想我可能有些严肃了,于是我又面带微笑地说:“你是不是有什么发现啊? ”原本神情紧张的他听我这么一说,似乎轻松了不少, 他很自豪地对我说:“老师, 你看漂亮的喷泉! ”他一边说一边用手堵住水龙头,水花溅出来,确实像喷泉一样。他继续笑着说:“老师,好看吗? 我想, 如果再加点肥皂泡泡就一定更漂亮了。”看着他兴奋地描述与演示,原本的怒火早就被他一脸的童真驱散了。我笑着说:“俊熙,你能发现水龙头里的‘喷泉’,很厉害,说明你很会观察,很会想象。可是你在欣赏喷泉的时候有没有注意到,我们洗手间地面上、墙上都溅上了水珠,而且肥皂也被你挤碎了掉在水池里? ”他抬起头看看我,低下头说:“我也发现水都跑到外面了, 可是我不是故意的。”我接着问:“那现在该怎么办呢? ”

这时,他抬头看我一眼,径直跑向生活区拿来抹布,开始擦墙壁,擦完又趴在地上擦,他发现光用布擦不干净,然后到生活区拿来了小拖布使劲地拖,就这样他自己把地上的水擦干了,擦完后还得意地向我炫耀:“老师,你看,墙和地都干净了……”想着刚才俊熙的一个个动作,我被震惊、定格在了那里,一方面为他的自我发现和自主打扫行为感到自豪,另一方面也为我最初的自以为是惭愧, 幸好我控制了自己的冲动。其实,孩子的每个行为背后都有属于他自己的意义与故事, 并且他们的能力远超出了我们成人的想象,他们能用自己的双手去解决自己的问题。

美丽的喷泉广场 篇2

自从有了这个喷泉广场,每当夜幕降临后我就和妈妈一起去那里散步。因为广场的正前方有个露天大舞厅,天天都有漂亮的大姐姐和帅气的大哥哥,还有白发苍苍的老爷爷和老奶奶在跳舞。看,他们随着音乐翩翩起舞,跳得多美啊!露天大舞厅的两边满是漂亮的灯光树,那五颜六色的灯光像一朵朵怒放的梅花,晶莹剔透。一排排碧绿的棕榈树,就像等候检阅的仪仗队,站得整整齐齐。

广场的两侧是绿油油的草坪。小草正吮吸着春天的甘露,好像心灵手巧的纺织能手,用星星点点的绿色织成了绿茵茵的地毯。草坪上那些枝叶茂密的小树,被灵巧的园艺工人修剪成一把把精致的绿色大伞,有的肥厚浓绿,有的娇嫩鲜绿,十分惹人喜爱。

广场的中央是一个半月形的喷泉池,音乐喷泉像一块巨大的磁石,把四面八方的人群都吸引了过来。随着音乐响起,美丽的喷泉开始了它的神奇舞蹈。音乐的旋律跌宕起伏,喷泉也不断变换着颜色,摇晃着它那婀娜的身姿。有的像绽开的花朵,露出了它天真的笑容;有的像美丽的蝴蝶,翩翩起舞;有的像石林中的柱子,雄伟壮观;有的像一棵棵水晶树,晶莹透亮;有的像美丽的雨伞,时而张开,时而合拢……我们被喷泉深深地吸引了,发出啧啧的赞叹声。我目不转睛地观察着,陶醉其中。那飘出的小水珠,如烟,似雾,又像一粒粒珍珠,美丽极了!

我喜欢美丽的喷泉广场,更喜欢勤劳的家乡人民,是他们用勤劳的双手描绘出一幅幅多姿多彩的蓝图。

(指导老师 吴亚逆)

[自我介绍]

大家好,我叫邱诗莹,今年12岁了。我有一张瓜子脸,一对忽闪忽闪的大眼睛,还有一头乌黑的长发。我喜欢写作文、弹钢琴、跳舞、写毛笔字。上学期,在学校举行的书法比赛中,我的毛笔书法获得了一等奖。在作文比赛中,我也荣获了一等奖。去年,我被评为市级“三好学生”。

基于GPU的喷泉模拟 篇3

但是, 粒子系统算法计算量很大, 每一帧都要计算成千上万个粒子的属性值, 成为串行处理器CPU的沉重负担, 而且CPU与GPU间大量的数据传输也成为系统的瓶颈, 人们只能减少粒子数目, 以牺牲喷泉模拟精度的代价来换取宝贵的帧速率。

近几年来, 随着GPU运算能力和可编程性的大幅提高, GPU已经在需要大量运算的领域发挥了重要的作用。越来越多的研究人员开始把各种基于CPU的密集运算引入到GPU上, 从而利用GPU强大的运算能力, 加速整个算法的运算过程[2]。因此, 提出将实现喷泉模拟的粒子系统算法转移到GPU上实现, 以发挥GPU强大的运算能力;同时, 利用ShaderModel 3.0提供的顶点纹理功能[3], 将计算出的粒子属性值直接传送到顶点着色器, 避免了CPU与GPU之间大量的数据传输;另外, 针对GPU运算的局部性和不灵活性, 提出了CPU与GPU协同运算方法, 充分发挥了两种处理器的优点, 避免各自的缺陷。此外, 还实现了喷泉中水雾的模拟, 使喷泉效果更加逼真。

1 粒子系统

在粒子系统中, 每个粒子图元都有形状、大小、颜色、透明度、运动速度和运动方向、生命周期等属性, 它们都随时间变化而变化。随着时间的流逝, 每个粒子都要经历“产生”、“活动”和“死亡”三个阶段。通常生成粒子系统一帧画面的基本步骤为: (1) 产生新的粒子并加入系统中; (2) 设置每个粒子的属性值; (3) 从系统中删除已经超过生命周期的粒子; (4) 根据粒子的动态属性实现粒子的移动变换; (5) 绘制并显示有生命的粒子组成的图形。上述几个步骤不断循环, 形成了物体动态变化过程

2 GPU通用计算

GPU通用计算 (GPUComputing) , 又称GPGPU (General-Purpose Computing on GPU) , 是指利用GPU进行非图形的通用并行运算[4,5]。

2.1 GPU编程与CPU编程的区别

CPU是通用处理器, 其串行结构使CPU处理大量运算的效率受到了限制, GPU是并行处理器, 它有多条渲染管道和超高级流水线, 使GPU能快速并行地处理大量不相关的数据。但GPU对逻辑运算和位运算的处理能力较差。由于GPU和CPU在结构上的差异, 所以编程方法也有很大区别。

2.1.1 数据存储方面的区别

在CPU中, 大量的数据以数组的形式存储在内存中, 用数组下标作为索引对数据进行访问。而在GPU中, 大量数据是存储在纹理中的。纹理是一个二维图像, 由若干个像素组成, 每个像素都可以存储一个四维向量。GPU通过纹理坐标索引像素。当数据从CPU转移到GPU时, 要改变数据的存储结构和索引方式, 以符合纹理的要求。

2.1.2 运算的区别

CPU根据程序串行地进行计算, 利用循环可使CPU对数据依次进行操作。GPU则是通过着色器程序来对数据进行并行运算。着色器程序是一个SIMD (单指令多数据) 程序, 它会以绘图的方式对纹理中的数据进行并行处理。

2.1.3 输出结果的区别

CPU计算的结果以函数返回值的形式输出, 而GPU将运算的结果绘制成图像存放在纹理中, 读取纹理中的像素值就能得到GPU的计算结果。

2.2 适合GPU处理的问题

GPU是并行处理器, 它有多条渲染管道和很高的流水线级数, 所以计算量大、数据不相关的问题很适合用GPU解决。

3 GPU对粒子属性的计算

传统粒子系统算法中除了绘制粒子之外的计算都由CPU完成, 大量的计算使CPU成为整个系统的瓶颈, 无法满足大规模粒子系统实时渲染的要求。所以本文将粒子属性的计算转移到GPU上, 提高粒子系统的速度。

3.1 GPU下粒子的数据组织

根据喷泉粒子的特点, 需要存储到纹理中的粒子的属性如下:

Speed:存储粒子的速度, 是一个三维向量;

Position:存储粒子在世界坐标系下的位置, 是一个三维向量;

Live:粒子的生命值, 是一个bool型标量, TRUE表示粒子正在活动, FALSE表示粒子已经死亡。

GPU处理的数据存放在纹理里, 根据每种数据的精度和值域来选择合适的像素格式进行存储, 其中浮点像素格式是常用的像素格式, 它每一个颜色通道存储一个32位的浮点数据, 达到了GPU通用计算对数据精度的要求, 而且它的值域没有限制, 不像普通像素格式那样会把颜色值截断在[0, 1]范围内, 所以很适合存储数据。存储数据要考虑到对纹理存储空间的合理利用, 尽量将纹理像素的所有通道都用上, 避免浪费存储空间。纹理的大小要根据粒子系统的最大粒子数确定。

3.2 粒子状态的判定

粒子的状态分为产生、活动和死亡三种。

3.2.1 产生

粒子系统要不断地产生新粒子, 使粒子系统能够持续运行下去。GPU不能动态地为粒子分配存储空间, 所以产生粒子的方法就是将死亡粒子的生命值修改, 并赋予粒子初始的速度和位置。GPU没有全局缓冲, 无法对粒子系统做整体的规划, 所以产生哪些粒子由CPU决定。存储在纹理中的数据要由一个二维的纹理坐标进行索引, 为了产生粒子时能够索引一个区域的数据, 将以二维结构存储的数据按行拆开, 变成以一维结构存储的数据。如图1所示, 转换公式为:

式中M是二维纹理中的数据转换成一维格式的索引序号, U和V分别表示该数据在纹理中的纹理坐标的两个分量, W和H分别表示UV两个方向的纹理大小。

CPU通过计算得到一个产生粒子的序列, 将这一序列的最大和最小索引值作为参数传递给GPU, 如果粒子的索引值在产生粒子序列的范围内, 则这个粒子就作为新产生的粒子进行初始化。

3.2.2 活动

活动是指产生的粒子在死亡前随时间变化而改变各属性值的状态。还没有落到地面上的粒子就是活动的。比较粒子和地面的高度值, 如果粒子的高度值高于地面, 那粒子的状态就是活动。

3.3.3死亡

死亡是指喷泉粒子落到了地下, 属性值不再变化的状态。当粒子的高度值低于地面时粒子死亡。死亡的粒子不需要计算属性值, 也不用渲染, 直到该粒子被重新产生。

3.3 粒子属性的控制

粒子属性的计算在GPU上实现, 将粒子属性的控制问题转化为三维场景的绘制问题交给GPU计算, 将结果保存在纹理中, 以便下面的程序使用。利用GPU计算粒子的属性分为以下步骤: (1) 在屏幕上绘制一个矩形区域, 矩形区域中所包含的像素数要和最大粒子数相同; (2) 编写顶点着色器程序, 为矩形区域的四个顶点分配纹理坐标; (3) 根据粒子属性的控制方法编写像素着色器程序, GPU通过对矩形区域中各像素颜色值的计算, 获得粒子的属性值; (4) 将用来保存计算数据的纹理设为渲染目标; (5) 渲染矩形区域, 计算出所有粒子的属性值并保存到目标纹理中。

GPU计算粒子属性时, 一帧内同一张纹理不能同时被读和写, 所以同一属性要用两张纹理进行交替存储。利用多渲染目标技术可以在一次渲染中同时将粒子的各属性值存储到不同的纹理中。下面针对粒子各个阶段进行分析。

3.3.1 产生粒子属性值的计算

新产生的粒子需要初始化位置和速度。喷泉粒子的初始位置与喷泉喷水口的位置相同, 但又不能所有的粒子初始位置都相同, 所以要加上一个随机值。

式中P0是粒子的初始位置, Pemiter是喷泉喷水口的位置, Rand是一个由三个随机数组成的向量, 它的大小决定着喷泉喷水口处水柱的粗细。

粒子的初始速度是由喷水口的压力和方向决定的, 它们分别决定了初始化速度的大小和方向。下面是粒子初始速度的公式

式中V0是粒子的初始化速度, Randx、Randy、Randz分别是粒子三个方向分量的随机数, 它们的大小决定了粒子运动方向的散度, Vemiter是喷水口的喷水速度, 它作用在粒子向上的速度分量上, 这四个变量确定了粒子在喷水口的物体坐标系下的速度, MRotate是喷水口的旋转矩阵, 将它们相乘, 就等到了粒子在世界坐标系下的速度值。

3.3.2 活动粒子属性值的计算

活动的粒子受到力的作用而不断地改变速度和位置, 根据牛顿力学公式求得

式中Vn和Pn是要计算的粒子的速度和位置, Vn-1和Pn-1是上一帧粒子的速度和位置, a是粒子的加速度, 在X和Z方向上, 粒子的加速度由风力确定, 在Y方向上由重力和空气阻力确定, Δt是一帧持续的时间。

3.3.3 死亡粒子属性值的计算

死亡的粒子只需将它的生命值设定为0, 不需要绘制, 也无需计算它的速度和位置。

3.4 粒子的绘制

绘制粒子时读取粒子属性值要用到顶点纹理获取技术 (VertexTextureFetch) , 它可以在顶点着色器中读取纹理像素中存储的粒子属性值, 而不需要将他们传递给CPU, 大大减少了GPU和CPU之间的通信。ATI的显卡不支持顶点纹理获取技术, 但是它支持渲染到顶点缓冲区技术 (RendertoVertex Buffer) , 可将纹理中的粒子属性数据解释为顶点数据, 实现与顶点纹理获取同样的效果。粒子绘制分为以下步骤。

3.4.1 建立顶点缓冲区

为粒子顶点缓冲区, 并建立顶点索引, 使其中每四个顶点组合绘制两个面片, 组成一个四边形。顶点格式中要包括纹理坐标0, 用来映射粒子的纹理, 还要包括粒子属性数据存储的纹理坐标, 用来索引位置值。索引属性值需要精确的定位到纹理中的像素, 假如需要在一个m×n尺寸的纹理中索引第x列第y行的像素则纹理坐标的计算方法是

式中U和V分别是UV方向的纹理坐标值。纹理坐标的计算很重要, 如果纹理坐标不精确, 那么被采样后的像素就会是一个错误的结果。

3.4.2 绘制顶点

从纹理中取出的位置值是粒子在世界坐标系下的位置, 将它变换到相机坐标系下, 根据顶点的纹理坐标0, 将粒子的四个顶点分别绘制在粒子的四个角上, 这样粒子就可以正对着屏幕了。

GPU不能选择性地绘制顶点, 这样不管是活动的粒子还是死亡的粒子, GPU都会将它们的顶点绘制出来。对于死亡的粒子, 利用Live值将它的四个顶点绘制在同样的位置值上, 这样粒子就不会在屏幕中显示出来了。顶点位置的计算公式如下

式中PV是要计算的顶点位置, P是从属性纹理中获取的粒子位置, U0和V0分别是顶点纹理坐标0的两个分量, S是粒子的大小, L是粒子的生命值, MV和MP分别是相机矩阵和投影矩阵。

4 水雾的生成与绘制

当喷泉喷水口的压力值比较高时, 高速的水流与空气碰撞会产生很多水雾, 使喷泉产生雾蒙蒙的效果。水雾的形态和运动特征都不同于水滴, 水雾的纹理透明度高, 且呈连续的随机变化, 利用柏林噪声函数可以生成出很好的效果。水雾的运动受到重力、空气阻力和风力的影响, 其中空气阻力和风力的影响比水滴大得多, 所以水雾运动也和水滴差距很大。

水雾粒子是通过水滴粒子变异得来的, 根据喷口的压力值, 通过CPU计算出水滴变异成水雾的概率值生成变异函数, 函数的自变量是像素的纹理坐标, 在GPU中根据该函数将水滴粒子在适当的时刻变异成水雾粒子, 就能使喷泉产生雾化的朦胧效果。图2是没有水雾和有水雾的喷泉效果对比。

5 实验结果和分析

实验的硬件环境为:Intel 2.20GHz处理器、2G内存、NVIDIA GeForceGT 240M显卡, 操作系统是WindowsXP。开发工具为VC++7.0和Directx9.0。

图3是应用本文方法实现的多喷口组合喷泉效果图。表1是GPU与CPU分别实现的喷泉帧速率对比, 由表可知, 当喷泉粒子数少于2万时, CPU模拟的喷泉速度比GPU要快, 但随着粒子数的增大, CPU的帧速率明显下降, 而GPU的帧速率下降缓慢, 当粒子数达到500万时, GPU实现的喷泉仍能保证实时, 而CPU的帧速率仅为4.8。

6 结论

将传统的粒子系统算法移植到了GPU上, 研究了GPU上实现粒子系统的详细步骤, 分析了移植过程出现的问题并给予了合理有效的解决方法,

归纳了移植过程用到的关键技术, 成功地实现了基于GPU的喷泉效果, 大大提高了大规模喷泉场景的运行速度, 使其能够实时绘制, 并提出了喷泉中水雾的生成方法, 使喷泉效果更加逼真。

进一步的研究可以考虑以下两点: (1) 进一步优化GPU中的算法, 使粒子系统的速度有更大的提高; (2) 将多喷头的喷泉系统进行优化, 防止喷头切换时造成的流水线中断。

摘要:粒子系统一直是模拟喷泉特效最常用的方法, 但是当喷泉规模较大时, 每一帧都要计算大量的粒子属性, 使喷泉的模拟很难达到实时。针对以上问题, 提出基于GPU加速的粒子系统喷泉模拟方法, 充分发挥GPU强大的运算能力, 并与CPU配合以弥补GPU的不足, 大大地提高了粒子系统的运行速度, 使几百万数量的喷泉粒子能够实时绘制。同时还提出喷泉水雾的生成方法, 使喷泉效果更加逼真。

关键词:并行处理器,粒子系统,喷泉,水雾

参考文献

[1] Reeves W T.Particle systems-a technique for modeling a class offuzzy objects.Computer Graphics (S0097—8930) , 1983;17 (3) :359—376

[2]王世元.基于GPU的光线跟踪算法的加速结构比较研究.武汉:华中师范大学.2008

[3] Gerasimov P, Randima (Randy) , Green F S.Shader Model 3.0 U-sing Vertex Textures. (2004—06) , ftp://download.nvidia.com/de-veloper/Papers/2004/Vertex_Textures/Vertex_Textures.pdf

[4] Owens J D, Houston M, Luebke D, et al.GPUcomputing.//IEEEProceedings.Beijing:Sinomaps Press, 2008;96 (5) :879—899

美丽的喷泉作文 篇4

正当我陶醉这美景,流连忘返时,时间不早了,妈妈叫我们回家。我恋恋不舍的离开灵湖公园,真希望明天还能看到这美妙的喷泉。

★ 作文喷泉

★ 美丽的音乐喷泉小学作文450字

★ 喷泉的作文400字作文范文

★ 关于音乐喷泉的作文

★ 大雁塔音乐喷泉作文

上一篇:有效传播下一篇:个性特色技术