Plasma是个原理极其简单的特效,被广泛的应用于DEMO中,大量的DEMO都会来上一段柔和的,粘稠的,象什么浆汁一样流动的PLASMA伴随强劲的音乐,产生少许恶心的效果。你注意看某些电视广告的背景是幻变的背景,那是由专用视频硬件产生的类似Plasma效果,我们把那叫做电子背景。不论硬件软件,效果原理都类似。
请看效果插图:

哇,好酷啊!你知不知道是怎么完成的?
先让我来分析一下: 从现象上分析得以下要求:
1.Plasma是个平面内的函数图象z=f(x,y)。( x向右爪子(0,xres), y向右爪子(0,yres),0>=z<=255) (向右爪子打不出来:( )
2.看起来平滑,一定是个连续的函数,函数值没有发生跳变。
3.易于生成,但是又要看起来没有规律和某种模式。
4.要有平滑的调色版动画。
解决问题的思路是:
1.平滑的最易得的函数是三角函数sin,cos,而且可以保证结果在一定范围内平滑变化。由x,y按某一规律算出角度代入sin,cos函数。(老赫猜想产生电子背景的硬件里一定有三角函数发生器,拆开研究研究???)
2.要看起来没有模式和规律就需要把几个函数加和起来,形成新的函数。(我认为这也是Perlin函数的基本思想之一,Particle System,Perlin Noise理论基础都不是很复杂,但正说明老外创新和举一反三的能力很强。)
3.平滑的调色板动画同样需要调色板RGB值平滑变化,不发生跳变,sin,cos函数来生成也是很好的选择。
4.不能去实时的计算sin,cos。其实是先做好几个函数图象的Buffer,再往结果缓冲区叠加。要Plasma好看,规律性不明显,则需要叠加函数要有相近的波长。
实现原理图如是:由两个虚拟的窗口在各自的空间移动,移动规则自己定,老赫的规则是在做带碰撞的匀速运动

以上两个图象的公式分别为:
lpScanLine1[j]=64+63*sin(hypot(i,j)/8.0);
lpScanLine2[j]=64 + 63 * cos( i/(27.0+15*cos(j/34.0 ) ) ) * sin( j/(12+21*sin(i/67.0))) ;
你可以调整系数或者自己写其他的公式,而不拘泥于以上。
好了,难度完全消失了。注意函数混合后的值是0-255,那么两个未混合的函数值范围应该是0-127,再遇到的问题最多是在取值时缓冲区边界移出了原缓冲区而把程序Crash掉(Off by one error)。 /*=============================================================
以下是对DX用户的提醒:
1. 由于是查表,函数值缓冲区建立在数组里就可以了,没有必要建在Surface里。省去了Lock,Unlock(理论上应该会快些!但肯定感觉不到)。
2.叠加结果缓冲区是Surface还是程序员自己的RAM Buffer ?
由于它马上要送上屏幕,要做Blit,所以从性能考虑,应该是Surface。用自己的Buffer,则要用占CPU时间的memcopy。
3..叠加结果缓冲区在Video RAM还是SYS RAM?
当然是SYS RAM!在循环里按像素打交道,Video RAM慢死你!所谓直接写屏其实并不是最快的办法!最快的方法是写RAM Buffer,DMA到Video RAM。(有硬件支持情况:Blit是微软对DMA Transfer的封装)
=============================================================*/
综上所诉,可知:
1.Plasma非常的容易编程,所用的知识也是初中学生也学过的。
2.性能比较好,即使是用Java这种蜗牛级的语言来写也可以有较满意的效果。