in ExampleGallery/EffectsExample.xaml.cs [732:833]
private ICanvasImage CreateLighting()
{
var heightMap = new LuminanceToAlphaEffect
{
Source = bitmapTiger
};
var distantDiffuseEffect = new DistantDiffuseEffect
{
Source = heightMap,
HeightMapScale = 2
};
var distantSpecularEffect = new DistantSpecularEffect
{
Source = heightMap,
SpecularExponent = 16
};
var pointDiffuseEffect = new PointDiffuseEffect
{
Source = heightMap,
HeightMapScale = 2
};
var pointSpecularEffect = new PointSpecularEffect
{
Source = heightMap,
SpecularExponent = 16
};
var spotDiffuseEffect = new SpotDiffuseEffect
{
Source = heightMap,
HeightMapScale = 2,
LimitingConeAngle = 0.25f,
LightTarget = new Vector3(bitmapTiger.Size.ToVector2(), 0) / 2
};
var spotSpecularEffect = new SpotSpecularEffect
{
Source = heightMap,
SpecularExponent = 16,
LimitingConeAngle = 0.25f,
LightTarget = new Vector3(bitmapTiger.Size.ToVector2(), 0) / 2
};
// Lay out all the different light types in a grid.
var xgap = (float)bitmapTiger.Size.Width * 1.1f;
var ygap = (float)bitmapTiger.Size.Height * 1.1f;
var compositeEffect = new CompositeEffect
{
Sources =
{
AddTextOverlay(distantDiffuseEffect, -xgap, -ygap),
AddTextOverlay(distantSpecularEffect, -xgap, 0),
AddTextOverlay(pointDiffuseEffect, -0, -ygap),
AddTextOverlay(pointSpecularEffect, -0, 0),
AddTextOverlay(spotDiffuseEffect, xgap, -ygap),
AddTextOverlay(spotSpecularEffect, xgap, 0),
CombineDiffuseAndSpecular(distantDiffuseEffect, distantSpecularEffect, -xgap, ygap),
CombineDiffuseAndSpecular(pointDiffuseEffect, pointSpecularEffect, 0, ygap),
CombineDiffuseAndSpecular(spotDiffuseEffect, spotSpecularEffect, xgap, ygap),
}
};
ICanvasImage finalEffect = compositeEffect;
// Check the screen size, and scale down our output if the screen is too small to fit the whole thing as-is.
var xScaleFactor = (float)canvas.ActualWidth / 750;
var yScaleFactor = (float)canvas.ActualHeight / 500;
var scaleFactor = Math.Min(xScaleFactor, yScaleFactor);
if (scaleFactor < 1)
{
finalEffect = new Transform2DEffect
{
Source = compositeEffect,
TransformMatrix = Matrix3x2.CreateScale(scaleFactor, bitmapTiger.Size.ToVector2() / 2)
};
}
// Animation changes the light directions.
animationFunction = elapsedTime =>
{
distantDiffuseEffect.Azimuth =
distantSpecularEffect.Azimuth = elapsedTime % ((float)Math.PI * 2);
distantDiffuseEffect.Elevation =
distantSpecularEffect.Elevation = (float)Math.PI / 4 + (float)Math.Sin(elapsedTime / 2) * (float)Math.PI / 8;
pointDiffuseEffect.LightPosition =
pointSpecularEffect.LightPosition =
spotDiffuseEffect.LightPosition =
spotSpecularEffect.LightPosition = new Vector3((float)Math.Cos(elapsedTime), (float)Math.Sin(elapsedTime), 1) * 100;
};
return finalEffect;
}