Silverlight中的HLSL不仅适用于场景与动画渲染,对于游戏中的角色,我们同样可以利用它制作动画特写。较常见的比如角色传送时的淡入淡出、扭曲变形、幻化呈现等切换动画,当然还有例如角色被DeBuff时所表现出来的放大缩小以及虚弱时的不规则体形等。适当的场合为角色增加动画特写使得游戏更显精致而华丽,当玩家身心愉快的融入其中而流连忘返时,或许正是这些魔幻般的特效在背后默默的飘散着令人迷醉的芳香。
还记得Shazzam吗?要制作特写依旧离不开这款强大的工具,以角色的传送特写“幻降”为例,对应Shazzam中的现成特效名为:DirectionalBlur,我们不妨看看它的HLSL代码:
float
Angle : register(C0);
float
BlurAmount : register(C1);
sampler2D Texture1Sampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c
=
0
;
float
rad
=
Angle
*
0.0174533f
;
float
xOffset
=
cos(rad);
float
yOffset
=
sin(rad);
for
(
int
i
=
0
; i
<
16
; i
++
)
{
uv.x
=
uv.x
-
BlurAmount
*
xOffset;
uv.y
=
uv.y
-
BlurAmount
*
yOffset;
c
+=
tex2D(Texture1Sampler, uv);
}
c
/=
16
;
return
c;
}
仅仅十来行不到1KB的代码,将之按照第5节的方法配置进游戏项目后,在角色传送结束时我们便通过Storyboard创建基于DirectionalBlur参数为BlurAmount的动画实现360任意角度的幻影过度动画特写:
DirectionalBlur directionalBlur
=
new
DirectionalBlur() { Angle
=
90
};
entity.Effect
=
directionalBlur;
Storyboard blurStoryboard
=
new
Storyboard();
DoubleAnimation doubleAnimation
=
new
DoubleAnimation() {
From
=
-
0.25
,
To
=
0
,
Duration
=
new
Duration(TimeSpan.FromMilliseconds(
600
)),
};
Storyboard.SetTarget(doubleAnimation, directionalBlur);
Storyboard.SetTargetProperty(doubleAnimation,
new
PropertyPath(
"
BlurAmount
"
));
blurStoryboard.Children.Add(doubleAnimation);
EventHandler handler
=
null
;
blurStoryboard.Completed
+=
handler
=
(s1, e1)
=>
{
Storyboard sb
=
s1
as
Storyboard;
sb.Stop();
sb.Completed
-=
handler;
entity.Effect
=
null
;
};
blurStoryboard.Begin();
某些场合为了突出玩家隆重登场,我们通常还会使用到比如“影合”(GrowablePoissonDisk)的动画特写:无数个角色的重影由四面八方汇聚而来,如同灵魂与力量的回归附体:
某些时候角色从一个空间向另外一个空间穿梭,虚幻的感受是身体被分解成粒子最终从下至上又被重新组合,此时常会用到“新生”(CircleReveal)动画特写来描述这样一个穿越生死的经历:
除此之外,类似百叶窗的切片特写以及波动扭曲特写在表述特定魔法效果时同样可以起到锦上添花之功效:
到此为止,本系列Demo中已集成了10数款精炼而实用的HLSL渲染特效,单独的存放于名为Effects的项目中,使用起来非常简便。无论是企业应用亦或是游戏开发;无论是将之用于窗体的渲染,还是用于场景、动画、角色的动画特写都显得游刃有余:
当然,发自内心的希望更多的Silverlight开发者能融入到HLSL的编写中,实现并分享更多更加炫酷的动画特效为Silverlight将来一统三端打下基础。不远了,Silverlight 5 发布后游戏开发都会易如反掌,一切特效在Silverlight面前将一文不值。我始终坚信:追求极致的心必定银光四射,长空千里!
本节源码请到目录中下载
在线演示地址:http://cangod.com