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; }
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); }