private void CreateFlameEffect()
{
// Thicken the text.
morphology = new MorphologyEffect
{
// The Source property is set by SetupText().
Mode = MorphologyEffectMode.Dilate,
Width = 7,
Height = 1
};
// Blur, then colorize the text from black to red to orange as the alpha increases.
var colorize = new ColorMatrixEffect
{
Source = new GaussianBlurEffect
{
Source = morphology,
BlurAmount = 3f
},
ColorMatrix = new Matrix5x4
{
M11 = 0f, M12 = 0f, M13 = 0f, M14 = 0f,
M21 = 0f, M22 = 0f, M23 = 0f, M24 = 0f,
M31 = 0f, M32 = 0f, M33 = 0f, M34 = 0f,
M41 = 0f, M42 = 1f, M43 = 0f, M44 = 1f,
M51 = 1f, M52 = -0.5f, M53 = 0f, M54 = 0f
}
};
// Generate a Perlin noise field (see flamePosition).
// Animate the noise by modifying flameAnimation's transform matrix at render time.
flameAnimation = new Transform2DEffect
{
Source = new BorderEffect
{
Source = new TurbulenceEffect
{
Frequency = new Vector2(0.109f, 0.109f),
Size = new Vector2(500.0f, 80.0f)
},
// Use Mirror extend mode to allow us to spatially translate the noise
// without any visible seams.
ExtendX = CanvasEdgeBehavior.Mirror,
ExtendY = CanvasEdgeBehavior.Mirror
}
};
// Give the flame its wavy appearance by generating a displacement map from the noise
// (see flameAnimation) and applying this to the text.
// Stretch and position this flame behind the original text.
flamePosition = new Transform2DEffect
{
Source = new DisplacementMapEffect
{
Source = colorize,
Displacement = flameAnimation,
Amount = 40.0f
}
// Set the transform matrix at render time as it depends on window size.
};
// Composite the text over the flames.
composite = new CompositeEffect()
{
Sources = { flamePosition, null }
// Replace null with the text command list when it is created.
};
}