public override object Process(Scene scene, Frame node) { if (scene == null) { return(null); } string tag = node.Tag; var match = _pattern.Match(tag); if (!match.Success) { return(null); } ShadowMapTechnique sm; if (match.Groups["S"].Success) { sm = new ShadowMapTechnique(int.Parse(match.Groups["S"].Value)) { IsDynamic = match.Groups["D"].Success } } ; else { sm = new ShadowMapTechnique() { IsDynamic = match.Groups["D"].Success } }; Camera camera = (Camera)node.Component; Frame affector = scene.FindNode(match.Groups["A"].Value); sm.Camera = camera; sm.Affector = affector; sm.UpdatePose(affector.GlobalPose); affector.Technique = sm; if (!match.Groups["K"].Success) { node.Component = null; node.Remove(); node.Dispose(); } if (!EngineState.Shadow.ShadowMapping.Enable) { EngineState.Shadow.ShadowMapping.Enable = true; EngineState.Shadow.Enable = true; } return(sm); } }
public void AutomaticShadowMapping() { SceneTests.InitializeScene(); var content = ImportContent(); content.OnSceneAttach(SceneManager.Scene); //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\nissan2.DAE"); //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\talia.DAE"); if (SceneManager.Scene.Physics != null) { SceneManager.Scene.Physics.Enable = true; } if (SceneManager.Scene.Lights.Count == 0) { var light = new Light() { Diffuse = new Vector3(1, 1, 1), Specular = new Vector3(1, 1, 1), Type = LightType.Directional, Enable = true }; SceneManager.Scene.Create("DirectionalLight0", new FrameLight(light), localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0)); } FrameLight.CreateShadowMapForAllLights(SceneManager.Scene); _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault(); _targetCamera = _technique.Camera; _technique.Bias = 0.9e-2f; SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0); SceneManager.Scene.AmbientLight.SkyColor = new Vector3(0.2f, 0.2f, 0.2f); Engine.Presenter.Rendering += Presenter_Rendering; SceneManager.Scene.Dynamics.Add(new Dynamic(x => { if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D1)) { _technique.KernelSize = 3; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D2)) { _technique.KernelSize = 5; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D3)) { _technique.KernelSize = 7; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D4)) { _technique.KernelSize = 1; } })); }
public void Import() { SceneTests.InitializeScene(); //RenderManager.PushTechnique<DefferedLigthing<DefferedLightingEffect>>(); //EngineState.Shadow.Enable = true; //EngineState.Shadow.ShadowMapping.Enable = true; //Deffered.DrawGBuffers<DefferedShadowRender>(); // var content = ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\shadowScene.DAE"); var content = ImportContent(); if (content == null) { return; } if (SceneManager.Scene.Physics != null) { SceneManager.Scene.Physics.Enable = true; } if (SceneManager.Scene.Lights.Count == 0) { var light = new Light() { Diffuse = new Vector3(1, 1, 1), Specular = new Vector3(1, 1, 1), Type = LightType.Directional, Enable = true }; SceneManager.Scene.Create("DirectionalLight0", new FrameLight(light), localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0)); FrameLight.CreateShadowMapForAllLights(SceneManager.Scene); } _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault(); if (_technique == null) { FrameLight.CreateShadowMapForAllLights(SceneManager.Scene); _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault(); } _targetCamera = _technique.Camera; _technique.KernelSize = 3; //targetCamera.ZNear = 1; //targetCamera.ZFar = 1000; //targetCamera.AspectRatio = 1; //targetCamera.FieldOfView = Numerics.PIover6; //targetCamera.Type = ProjectionType.Perspective; //targetCamera.CommitChanges(); _technique.Bias = 0.9e-2f; SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0); SceneManager.Scene.AmbientLight.SkyColor = new Vector3(0.2f, 0.2f, 0.2f); //EngineState.Lighting.Reflection.UseDefaultTechnique = true; Engine.Presenter.Rendering += Presenter_Rendering; SceneManager.Scene.Dynamics.Add(new Dynamic(x => { if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D1)) { _technique.KernelSize = 3; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D2)) { _technique.KernelSize = 5; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D3)) { _technique.KernelSize = 7; } else if (Engine.KeyBoard.IsKeyPressed(Igneel.Input.Keys.D4)) { _technique.KernelSize = 1; } })); // } //} }
public void EdgeFiltering() { SceneTests.InitializeScene(); //var content = ImportContent(); var content = ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\shadowScene.DAE"); EngineState.Shadow.ShadowMapping.PcfBlurSize = 5; content.OnSceneAttach(SceneManager.Scene); //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\nissan2.DAE"); //ContentImporter.Import(SceneManager.Scene, @"C:\Users\ansel\Documents\3dsmax\export\talia.DAE"); if (SceneManager.Scene.Physics != null) { SceneManager.Scene.Physics.Enable = true; } //if (SceneManager.Scene.Lights.Count == 0) //{ // var light = new Light() // { // Diffuse = new Vector3(1, 1, 1), // Specular = new Vector3(1, 1, 1), // Type = LightType.Directional, // Enable = true // }; // SceneManager.Scene.Create("DirectionalLight0", new LightInstance(light), // localRotationEuler: new Euler(0, Numerics.ToRadians(70), 0)); //} FrameLight.CreateShadowMapForAllLights(SceneManager.Scene); _technique = SceneManager.Scene.Lights.Where(x => x.Node.Technique is ShadowMapTechnique).Select(x => (ShadowMapTechnique)x.Node.Technique).FirstOrDefault(); _targetCamera = _technique.Camera; _technique.Bias = 0.9e-2f; SceneManager.Scene.AmbientLight.GroundColor = new Vector3(0, 0, 0); SceneManager.Scene.AmbientLight.SkyColor = new Vector3(0.2f, 0.2f, 0.2f); EngineState.Shadow.ShadowMapping.PcfBlurSize = 3; var edgeTechnique = new EdgeShadowFilteringTechnique(); RenderManager.PushTechnique(edgeTechnique); bool debug = true; if (debug) { Form form = new Form(); form.BackColor = Color.Blue; form.StartPosition = FormStartPosition.CenterScreen; form.Size = new System.Drawing.Size(edgeTechnique.ShadowFactorTex.Width, edgeTechnique.ShadowFactorTex.Height); form.SuspendLayout(); Canvas3D canvas = new Canvas3D() { Width = form.Width, Height = form.Height }; canvas.Dock = DockStyle.Fill; var presenter = canvas.CreateSwapChainPresenter(); form.Controls.Add(canvas); form.ResumeLayout(); Engine.RenderFrame += () => { presenter.Begin(new Color4(Color.Aqua.ToArgb())); var device = GraphicDeviceFactory.Device; device.Ps.SamplerStacks[0].Push(SamplerState.Linear); device.Blend = SceneTechnique.NoBlend; var texture = edgeTechnique.EdgeSrcTexture; RenderTexture(device, texture, width: texture.Width, height: texture.Height); device.Ps.SamplerStacks[0].Pop(); presenter.End(); }; form.Show(); } }
public ShadowMapGlyp(Scene scene, ShadowMapTechnique sm) : base(scene, sm.Camera) { this.sm = sm; }
public ShadowMapTechnique CreateShadowMap(Scene scene, int size, bool isDynamic, Vector3 maxWorld, Vector3 minWorld) { if (scene == null) { throw new NullReferenceException("Scene"); } var sm = new ShadowMapTechnique(size) { IsDynamic = isDynamic }; var viewMat = Matrix.LookAt(_globalPosition, _globalPosition + _globalDirection, Vector3.UnitY); var camera = new Camera(); camera.View = viewMat; if (_light.Type == LightType.Directional) { var centerWorld = 0.5f * (maxWorld + minWorld); float distance = Vector3.Distance(minWorld, maxWorld) * 0.5f; var newPosition = centerWorld - _globalDirection * distance; camera.Position = newPosition; viewMat = camera.View; } Vector3 maxView = new Vector3(float.MinValue, float.MinValue, float.MinValue); Vector3 minView = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); foreach (var n in scene.Geometries) { var meshContainer = n.Component as FrameMesh; if (meshContainer != null) { Mesh mesh = meshContainer.Mesh; var globalPose = n.GlobalPose; var pose = globalPose * viewMat; var positionView = mesh.GetVertexBufferView <Vector3>(IASemantic.Position); for (int i = 0; i < positionView.Count; i++) { var pos = positionView[i]; var posView = Vector3.TransformCoordinates(pos, pose); maxView = Vector3.Max(posView, maxView); minView = Vector3.Min(posView, minView); } mesh.ReleaseViews(); } FrameSkin skin = n.Component as FrameSkin; if (skin != null) { TransformSkin(skin.Skin, ref minView, ref maxView, viewMat); } } camera.ZNear = Math.Max(1, minView.Z); camera.ZFar = Math.Max(2, maxView.Z); camera.OrthoWidth = maxView.X - minView.X; camera.OrthoHeight = maxView.Y - minView.Y; camera.FieldOfView = Numerics.PIover2; camera.Type = ProjectionType.Orthographic; sm.Camera = camera; sm.Affector = Node; Node.Technique = sm; sm.OnSceneAttach(scene); return(sm); }