public static async Task Run(EngineContext engineContext) { #if PARADOX_YEBIS YebisPlugin yebisPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("YebisPlugin", out yebisPlugin)) { yebisPlugin.Glare.Enable = false; yebisPlugin.DepthOfField.Enable = false; yebisPlugin.ToneMap.AutoExposure.Enable = false; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; } #endif EffectOld effect = engineContext.RenderContext.Effects.First(x => x.Name == "Multicore"); //Effect effect = engineContext.RenderContext.BuildEffect("Multicore") // .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainDepthReadOnlyPlugin }) // .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainDepthReadOnlyPlugin }) // .Using(new BasicShaderPlugin(new ShaderMixinSource() // { // "NormalVSStream", // "PositionVSStream", // new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream")), // new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColor")), // TODO: Default values! // "BRDFDiffuseLambert", // "BRDFSpecularBlinnPhong", // }) { RenderPassPlugin = renderingSetup.MainDepthReadOnlyPlugin }) // .Using(new BasicShaderPlugin("AlbedoFlatShading") { RenderPassPlugin = renderingSetup.MainDepthReadOnlyPlugin }) // .Using(new LightingShaderPlugin { RenderPassPlugin = renderingSetup.LightingPlugin }) // //.Using(new BasicShaderPlugin("LightDirectionalShading") { RenderPassPlugin = renderingSetup.MainDepthReadOnlyPlugin }) // ; //effect.Permutations.Set(LightingPermutation.Key, new LightingPermutation { Lights = new Light[] { new DirectionalLight { LightColor = new Color3(1.0f), LightDirection = new R32G32B32_Float(-1.0f, -1.0f, 1.0f) } } }); var rand = new Random(); var cubeMeshData = Enumerable.Range(0, 10).Select(x => MeshDataHelper.CreateBox(10, 10, 10, new Color((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), 1.0f))).ToArray(); var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); int objectSqrtCount = 31; int meshCount = objectSqrtCount * objectSqrtCount * objectSqrtCount; for (int j = 0; j < meshCount; ++j) { var effectMesh = new EffectMesh(effect, cubeMeshData[(j / 25) % 10]); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(effectMesh); var w2 = Matrix.Scaling(1.0f) * Matrix.Translation(new Vector3( (j % objectSqrtCount - objectSqrtCount / 2) * 30.0f - 30.0f, (((j / objectSqrtCount) % objectSqrtCount) - objectSqrtCount / 2) * 30.0f - 30.0f, (j / (objectSqrtCount * objectSqrtCount) - objectSqrtCount / 2) * 30.0f - 30.0f)); effectMesh.Parameters.Set(TransformationKeys.World, w2); } }
/// <summary> /// Initializes a new instance of the <see cref="ParticlePlugin" /> class. /// </summary> /// <param name="name">Name of this particle manager</param> public ParticlePlugin(string name) : base(name) { meshesToRender = new RenderPassListEnumerator(); Updaters = new TrackingCollection<ParticleEmitterComponent>(); currentUpdaters = new List<ParticleUpdaterState>(); updatersToRemove = new List<ParticleUpdaterState>(); Updaters.CollectionChanged += UpdatersOnCollectionChanged; EnableSorting = true; }
/// <summary> /// Initializes a new instance of the <see cref="ParticlePlugin" /> class. /// </summary> /// <param name="name">Name of this particle manager</param> public ParticlePlugin(string name) : base(name) { meshesToRender = new RenderPassListEnumerator(); Updaters = new TrackingCollection <ParticleEmitterComponent>(); currentUpdaters = new List <ParticleUpdaterState>(); updatersToRemove = new List <ParticleUpdaterState>(); Updaters.CollectionChanged += UpdatersOnCollectionChanged; EnableSorting = true; }
public static async Task Run(EngineContext engineContext) { var renderingSetup = new RenderingSetup(); renderingSetup.Initialize(engineContext); var device = engineContext.RenderContext.GraphicsDevice; var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); EffectOld linearEffect = engineContext.RenderContext.BuildEffect("LinearColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "0"))); var linearMesh = new EffectMesh(linearEffect); renderingSetup.LinearColorPlugin.RenderPass.AddPass(linearMesh.EffectMeshPasses[0].EffectPass); var linearTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.RenderTarget); linearMesh.Parameters.Set(RenderTargetKeys.RenderTarget, linearTexture.ToRenderTarget()); effectMeshGroup.AddMesh(linearMesh); EffectOld reinhardColor = engineContext.RenderContext.BuildEffect("ReinhardColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "1"))); var reinhardMesh = new EffectMesh(reinhardColor); renderingSetup.ReinhardColorPlugin.RenderPass.AddPass(reinhardMesh.EffectMeshPasses[0].EffectPass); var reinhardTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.RenderTarget); reinhardMesh.Parameters.Set(RenderTargetKeys.RenderTarget, reinhardTexture.ToRenderTarget()); effectMeshGroup.AddMesh(reinhardMesh); var yebisTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R8G8B8A8_UNorm, TextureFlags.RenderTarget); #if XENKO_YEBIS var yebisPlugin = renderingSetup.YebisPlugin; yebisPlugin.RenderSource = reinhardTexture; yebisPlugin.RenderTarget = yebisTexture.ToRenderTarget(); yebisPlugin.Glare.Enable = false; yebisPlugin.Lens.Vignette.Enable = false; yebisPlugin.Lens.Distortion.Enable = false; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; yebisPlugin.ToneMap.Type = ToneMapType.Reinhard; engineContext.RenderContext.Register(yebisPlugin); #endif EffectOld filmicEffect = engineContext.RenderContext.BuildEffect("FilmicColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "2"))); var filmicMesh = new EffectMesh(filmicEffect); renderingSetup.FilmicColorPlugin.RenderPass.AddPass(filmicMesh.EffectMeshPasses[0].EffectPass); var filmicTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget); filmicTexture.Name = "FilmicTexture"; filmicMesh.Parameters.Set(RenderTargetKeys.RenderTarget, filmicTexture.ToRenderTarget()); effectMeshGroup.AddMesh(filmicMesh); EffectOld mainEffect = engineContext.RenderContext.BuildEffect("ComposeToneMap") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComposeToneMap"))); var mainMesh = new EffectMesh(mainEffect); renderingSetup.MainPlugin.RenderPass.AddPass(mainMesh.EffectMeshPasses[0].EffectPass); mainMesh.Parameters.Set(TexturingKeys.Texture0, linearTexture); mainMesh.Parameters.Set(TexturingKeys.Texture2, yebisTexture); mainMesh.Parameters.Set(TexturingKeys.Texture3, filmicTexture); mainMesh.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); effectMeshGroup.AddMesh(mainMesh); }
public static async Task MoveLights(EngineContext engineContext) { var r = new Random(0); var config = AppConfig.GetConfiguration<Config>("LightScript2"); LightingPrepassPlugin lightingPrepassPlugin; if (!engineContext.DataContext.RenderPassPlugins.TryGetValueCast("LightingPrepassPlugin", out lightingPrepassPlugin)) return; var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); // Lights for (int i = 0; i < 1024; ++i) { var effectMesh = new EffectMesh(lightingPrepassPlugin.Lights); Color3 color = (Color3)Color.White; switch (i % 7) { case 0: color = new Color3(0.7f, 0.0f, 0.0f); break; case 1: color = new Color3(0.0f, 0.7f, 0.0f); break; case 2: color = new Color3(0.0f, 0.0f, 0.7f); break; case 3: color = new Color3(0.7f, 0.7f, 0.0f); break; case 4: color = new Color3(0.7f, 0.0f, 0.7f); break; case 5: color = new Color3(0.0f, 0.7f, 0.7f); break; case 6: color = new Color3(0.7f, 0.7f, 0.7f); break; } effectMesh.Parameters.Set(LightKeys.LightRadius, 60.0f); effectMesh.Parameters.Set(LightKeys.LightColor, color); effectMesh.Parameters.Set(LightKeys.LightIntensity, 1.0f); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(effectMesh); } bool animatedLights = config.AnimatedLights; EffectOld effectLight = null; try { effectLight = engineContext.RenderContext.RenderPassPlugins.OfType<LightingPrepassPlugin>().FirstOrDefault().Lights; } catch { return; } var lightInfo = new LightInfo[effectLight != null ? effectLight.Meshes.Count : 0]; for (int i = 0; i < lightInfo.Length; ++i) { lightInfo[i].Radius = (float)r.NextDouble() * 1000.0f + 500.0f; lightInfo[i].Phase = (float)r.NextDouble() * 10.0f; lightInfo[i].Z = (float)r.NextDouble() * 150.0f + 150.0f; } float time = 0.0f; var st = new Stopwatch(); var lastTickCount = 0; var st2 = new Stopwatch(); st2.Start(); bool firstTime = true; while (true) { await Scheduler.NextFrame(); time += 0.003f; if (lightInfo.Length > 0) { if (animatedLights || firstTime) { int index = 0; foreach (var mesh in effectLight.Meshes) { mesh.Parameters.Set(LightKeys.LightPosition, new Vector3(lightInfo[index].Radius * (float)Math.Cos(time * 3.0f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(time * 3.0f + lightInfo[index].Phase), lightInfo[index].Z)); index++; } firstTime = false; } } } }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); renderingSetup.RegisterLighting(engineContext); #if XENKO_YEBIS YebisPlugin yebisPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("YebisPlugin", out yebisPlugin)) { yebisPlugin.Glare.Enable = true; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; } #endif var lightPrepassPlugin = (LightingPrepassPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPrepassPlugin"); var gbufferPlugin = (GBufferPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("GBufferPlugin"); EffectOld effect = engineContext.RenderContext.BuildEffect("SimpleCube") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoSpecularBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoDiffuseBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("NormalVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("SpecularPowerPerMesh") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("PositionVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFDiffuseLambert") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFSpecularBlinnPhong") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream")) }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColorSynthetic")) }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new GBufferShaderPlugin { RenderPassPlugin = gbufferPlugin }) .Using(new DeferredLightingShaderPlugin() { RenderPassPlugin = lightPrepassPlugin }) .Using(new LightingShaderPlugin() { RenderPassPlugin = (LightingPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPlugin") }) .Using(new BasicShaderPlugin("LightDirectionalShading") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) ; var shadowMap1 = new ShadowMap(new DirectionalLight() { LightColor = new Color3(1.0f, 1.0f, 1.0f), LightDirection = new Vector3(1.0f, 1.0f, 1.0f) }); effect.Permutations.Set(ShadowMapPermutationArray.Key, new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }); var r = new Random(0); VirtualFileSystem.MountFileSystem("/global_data", "..\\..\\deps\\data\\"); VirtualFileSystem.MountFileSystem("/global_data2", "..\\..\\data\\"); SkyBoxPlugin skyBoxPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("SkyBoxPlugin", out skyBoxPlugin)) { var skyBoxTexture = (Texture2D)await engineContext.AssetManager.LoadAsync <Texture>("/global_data/gdc_demo/bg/GDC2012_map_sky.dds"); skyBoxPlugin.Texture = skyBoxTexture; } var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(10000, 10000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new Vector3(0, 0, 0))); // Lights for (int i = 0; i < 1024; ++i) { Color3 color = (Color3)Color.White; switch (i % 4) { case 0: color = (Color3)Color.DarkOrange; break; case 1: color = (Color3)Color.DarkGoldenrod; break; case 2: color = (Color3)Color.DarkSalmon; break; case 3: color = (Color3)Color.DarkRed; break; } var effectMesh = new EffectMesh(lightPrepassPlugin.Lights); effectMesh.Parameters.Set(LightKeys.LightRadius, (float)r.NextDouble() * 200 + 200.0f); effectMesh.Parameters.Set(LightKeys.LightColor, color); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(effectMesh); } EffectOld effectLight = lightPrepassPlugin.Lights; var lightInfo = new LightInfo[effectLight != null ? effectLight.Meshes.Count : 0]; for (int i = 0; i < lightInfo.Length; ++i) { lightInfo[i].Radius = (float)r.NextDouble() * 7000.0f + 500.0f; lightInfo[i].Phase = (float)(r.NextDouble() * Math.PI * 2.0); lightInfo[i].Z = (float)r.NextDouble() * 3000.0f;; } float time = 0.0f; // Meshes (quad) that will later be generated by the engine (light pre pass, SSAO, etc...) // Lights //var effectMesh = new EffectMesh(setup.LightingPrepassPlugin.Lights); //effectMesh.Parameters.Set(LightKeys.LightRadius, 1000.0f); //effectMesh.Parameters.Set(LightKeys.LightColor, new R32G32B32_Float(1.0f, 1.0f, 1.0f)); //effectMesh.Parameters.Set(LightKeys.LightPosition, new R32G32B32_Float(0, 0, 1200)); //effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); //effectMeshGroup.AddMesh(effectMesh); //var boxMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(300, R8G8B8A8.LightBlue)); //boxMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); //boxMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new R32G32B32_Float(0, 0, 200))); //effectMeshGroup.AddMesh(boxMesh); var clock = new Stopwatch(); clock.Start(); int sizeX = 10; int sizeY = 10; var spheres = new Sphere[sizeY, sizeX]; Random random = new Random(0); int size = 200; var meshData = MeshDataHelper.CreateSphere(size, 30, 30, Color.Gray); for (int iy = 0; iy < sizeY; iy++) { for (int ix = 0; ix < sizeX; ix++) { var sphere = new Sphere(); sphere.Mesh = new EffectMesh(effect, meshData); sphere.Phase = (float)random.NextDouble(); sphere.Speed = (float)random.NextDouble(); spheres[iy, ix] = sphere; effectMeshGroup.AddMesh(sphere.Mesh); } } while (true) { await Scheduler.Current.NextFrame(); for (int iy = 0; iy < sizeY; iy++) { for (int ix = 0; ix < sizeX; ix++) { var iFactor = (float)(iy * sizeY + ix) / (sizeX * sizeY); var sphere = spheres[iy, ix]; var sphereMesh = sphere.Mesh; var specularColor = Color.SmoothStep(Color.GreenYellow, Color.Gray, iFactor); // Matrix.RotationX((float)Math.PI/2.0f) * M sphereMesh.Parameters.Set( TransformationKeys.World, Matrix.Translation( new Vector3( (ix - sizeX / 2) * (size * 1.2f) * 2.0f, (iy - sizeY / 2) * (size * 1.2f) * 2.0f, (float)(2000 * (0.5 + 0.5 * Math.Sin(clock.ElapsedMilliseconds / 1000.0f * sphere.Speed * 0.5f + Math.PI * sphere.Phase)))))); sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, iFactor * 0.9f); sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, specularColor); } } time = clock.ElapsedMilliseconds / 1000.0f; if (lightInfo.Length > 0) { int index = 0; foreach (var mesh in effectLight.Meshes) { mesh.Parameters.Set(LightKeys.LightPosition, new Vector3(lightInfo[index].Radius * (float)Math.Cos(-time * 0.17f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(-time * 0.05f + lightInfo[index].Phase), lightInfo[index].Z * (0.5f + 0.5f * (float)Math.Sin(-time * 0.1f + lightInfo[index].Phase * 2.0f)))); index++; } } } }
public static async Task MoveLights(EngineContext engineContext) { var r = new Random(0); var config = AppConfig.GetConfiguration <Config>("LightScript2"); LightingPrepassPlugin lightingPrepassPlugin; if (!engineContext.DataContext.RenderPassPlugins.TryGetValueCast("LightingPrepassPlugin", out lightingPrepassPlugin)) { return; } var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); // Lights for (int i = 0; i < 1024; ++i) { var effectMesh = new EffectMesh(lightingPrepassPlugin.Lights); Color3 color = (Color3)Color.White; switch (i % 7) { case 0: color = new Color3(0.7f, 0.0f, 0.0f); break; case 1: color = new Color3(0.0f, 0.7f, 0.0f); break; case 2: color = new Color3(0.0f, 0.0f, 0.7f); break; case 3: color = new Color3(0.7f, 0.7f, 0.0f); break; case 4: color = new Color3(0.7f, 0.0f, 0.7f); break; case 5: color = new Color3(0.0f, 0.7f, 0.7f); break; case 6: color = new Color3(0.7f, 0.7f, 0.7f); break; } effectMesh.Parameters.Set(LightKeys.LightRadius, 60.0f); effectMesh.Parameters.Set(LightKeys.LightColor, color); effectMesh.Parameters.Set(LightKeys.LightIntensity, 1.0f); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(effectMesh); } bool animatedLights = config.AnimatedLights; EffectOld effectLight = null; try { effectLight = engineContext.RenderContext.RenderPassPlugins.OfType <LightingPrepassPlugin>().FirstOrDefault().Lights; } catch { return; } var lightInfo = new LightInfo[effectLight != null ? effectLight.Meshes.Count : 0]; for (int i = 0; i < lightInfo.Length; ++i) { lightInfo[i].Radius = (float)r.NextDouble() * 1000.0f + 500.0f; lightInfo[i].Phase = (float)r.NextDouble() * 10.0f; lightInfo[i].Z = (float)r.NextDouble() * 150.0f + 150.0f; } float time = 0.0f; var st = new Stopwatch(); var lastTickCount = 0; var st2 = new Stopwatch(); st2.Start(); bool firstTime = true; while (true) { await Scheduler.NextFrame(); time += 0.003f; if (lightInfo.Length > 0) { if (animatedLights || firstTime) { int index = 0; foreach (var mesh in effectLight.Meshes) { mesh.Parameters.Set(LightKeys.LightPosition, new Vector3(lightInfo[index].Radius * (float)Math.Cos(time * 3.0f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(time * 3.0f + lightInfo[index].Phase), lightInfo[index].Z)); index++; } firstTime = false; } } } }
public override void Load() { base.Load(); var postEffectsPlugin = new PostEffectGraphPlugin("PostEffectPlugin") { RenderPass = RenderPass }; EffectOld hbaoEffect = this.EffectSystemOld.BuildEffect("HBAO") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin }) .Using(new BasicShaderPlugin(new ShaderClassSource("PostEffectHBAO") { GenericArguments = new object[] { UseNormal ? 1 : 0, (int)Quality } })) .KeepAliveBy(ActiveObjects) .InstantiatePermutation() .KeepAliveBy(ActiveObjects); // Parameters.AddSources(MainPlugin.ViewParameters); if (OfflineCompilation) { return; } var colorTexture = (Texture2D)GBufferPlugin.MainTargetPlugin.RenderTarget.Texture; bool doBlur = true; bool halfResAO = false; //================================================= //Add hbao pass //========================================== //HBAO params int HBAO_numDir = 16; //TODO: should we recreate the random texture if we change this parameter? //========================================== //Create random texture var rng = new Random(0); Vector3[] tab = new Vector3[64 * 64]; for (int i = 0; i < 64 * 64; i++) { float angle = (float)(2.0 * Math.PI * rng.NextDouble()) / (float)HBAO_numDir; Vector3 sample = new Vector3( (float)Math.Cos(angle), (float)Math.Sin(angle), (float)rng.NextDouble() ); tab[i] = sample; } var randomTexture = Texture.New2D(GraphicsDevice, 64, 64, PixelFormat.R32G32B32_Float, tab); var hbaoQuadMesh = new EffectMesh(hbaoEffect, name: "HBAO level").KeepAliveBy(ActiveObjects); //var renderTarget = renderingSetup.MainPlugin.RenderTarget; hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RandomTexture, randomTexture); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountDirection, CountDirection); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountStepMax, CountStepMax); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Radius, Radius); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Attenuation, Attenuation); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.AngleBias, AngleBias * (float)Math.PI / 180.0f); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Contrast, Contrast); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RenderTargetResolutionRatio, halfResAO ? 0.5f : 1.0f); hbaoQuadMesh.Parameters.Set(GBufferBaseKeys.GBufferTexture, GBufferPlugin.GBufferTexture); hbaoQuadMesh.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); if (!doBlur) { var aoRenderTarget = Texture.New2D(GraphicsDevice, GraphicsDevice.BackBuffer.Width, GraphicsDevice.BackBuffer.Height, PixelFormat.R8_UNorm, TextureFlags.RenderTarget).ToRenderTarget().KeepAliveBy(ActiveObjects); aoRenderTarget.Name = "AOTexture"; hbaoQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, aoRenderTarget); } else { EffectOld hbaoBlurEffect = this.EffectSystemOld.BuildEffect("HBAO Blur") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin }) .Using(new BasicShaderPlugin("PostEffectHBAOBlur")) .InstantiatePermutation(); //===================================================================== //BlurX EffectMesh hbaoBlurQuadMeshX = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur X level"); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(1, 0)); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, false); hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); //TODO: check the format (RGB 8 bits, or Float or half-float?) //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms! var backBuffer = GraphicsDevice.BackBuffer; postEffectsPlugin.AddLink( hbaoQuadMesh, RenderTargetKeys.RenderTarget, hbaoBlurQuadMeshX, PostEffectHBAOBlurKeys.AmbiantOcclusionTexture, new TextureDescription() { Width = backBuffer.Width >> (halfResAO ? 1 : 0), Height = backBuffer.Height >> (halfResAO ? 1 : 0), Format = PixelFormat.R8_UNorm }); //hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); //===================================================================== //BlurY EffectMesh hbaoBlurQuadMeshY = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur Y level"); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(0, 1)); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, !Debug); hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); //TODO: check the format (RGB 8 bits, or Float or half-float?) //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms! postEffectsPlugin.AddLink( hbaoBlurQuadMeshX, RenderTargetKeys.RenderTarget, hbaoBlurQuadMeshY, PostEffectHBAOBlurKeys.AmbiantOcclusionTexture, new TextureDescription { Width = backBuffer.Width, Height = backBuffer.Height, Format = PixelFormat.R8_UNorm }); hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.RenderTarget, RenderTarget); } var effectMeshGroup = new RenderPassListEnumerator(); foreach (var mesh in postEffectsPlugin.Meshes) { RenderSystem.GlobalMeshes.AddMesh(mesh); } // Link post effects (this will create intermediate surfaces) postEffectsPlugin.Resolve(); }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; //engineContext.RenderContext.Register(renderingSetup.LightingPlugin); //renderingSetup.RegisterLighting(engineContext); var shadowMapPlugin = new LightingPlugin { MainPlugin = renderingSetup.MainPlugin, RenderPass = engineContext.DataContext.RenderPasses.TryGetValue("ShadowMapPass") }; shadowMapPlugin.RenderContext = engineContext.RenderContext; var shadowMap1 = new ShadowMap(new DirectionalLight()) { Level = CascadeShadowMapLevel.X1, ShadowMapSize = 1024, ShadowDistance = 2000.0f } .SetFilter(sm => new ShadowMapFilterDefault(sm)); var shadowMap2 = new ShadowMap(new DirectionalLight()) { Level = CascadeShadowMapLevel.X2, ShadowMapSize = 1024, ShadowDistance = 2000.0f } .SetFilter(sm => new ShadowMapFilterVsm(sm)); shadowMapPlugin.AddShadowMap(shadowMap1); shadowMapPlugin.AddShadowMap(shadowMap2); shadowMap1.DirectionalLight.LightDirection = new Vector3(-1.0f, -1.0f, -1.0f); shadowMap1.DirectionalLight.LightColor = new Color3(1.0f, 0.5f, 0.5f); shadowMap2.DirectionalLight.LightDirection = new Vector3(-1.0f, 1.0f, -1.0f); shadowMap2.DirectionalLight.LightColor = new Color3(0.5f, 0.5f, 1.0f); engineContext.RenderContext.Register(shadowMapPlugin); EffectOld effect = engineContext.RenderContext.BuildEffect("Permutation") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { "NormalVSStream", "PositionVSStream", new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream")), new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColor")), // TODO: Default values! "BRDFDiffuseLambert", "BRDFSpecularBlinnPhong", "ShadingBase", }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new LightingShaderPlugin() { RenderPassPlugin = shadowMapPlugin }) ; var sphereMeshData = MeshDataHelper.CreateSphere(10.0f, 20, 20, Color.White); var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); int objectSqrtCount = 1; int meshCount = objectSqrtCount * objectSqrtCount * objectSqrtCount; var shadowMapPermutation1 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }; var shadowMapPermutation2 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap2 } }; var shadowMapPermutation3 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap1, shadowMap2 } }; effect.Permutations.Set(ShadowMapPermutationArray.Key, shadowMapPermutation1); var groups2 = new[] { shadowMapPermutation1, shadowMapPermutation2, shadowMapPermutation3 }; int groupIndex2 = 0; var effectMeshes = new List<EffectMesh>(); for (int j = 0; j < meshCount; ++j) { var effectMesh = new EffectMesh(effect, sphereMeshData); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effect.Permutations.Set(ShadowMapPermutationArray.Key, groups2[2]); var w2 = Matrix.Scaling(1.0f) * Matrix.Translation(new Vector3( (j % objectSqrtCount - objectSqrtCount / 2) * 30.0f - 30.0f, (((j / objectSqrtCount) % objectSqrtCount) - objectSqrtCount / 2) * 30.0f - 30.0f, (j / (objectSqrtCount * objectSqrtCount)) * 30.0f + 30.0f)); effectMesh.Parameters.Set(TransformationKeys.World, w2); effectMeshes.Add(effectMesh); } var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(1000, 1000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(0.0f, 0.0f, 0.0f)); var groups = new[] { new int[] { 0, 1 }, new int[] { 0 }, new int[] { 1 } }; int groupIndex = 0; await TaskEx.Delay(1000); foreach (var effectMesh in effectMeshes) effectMeshGroup.AddMesh(effectMesh); while (true) { await engineContext.Scheduler.NextFrame(); if (engineContext.InputManager.IsKeyPressed(Keys.F8)) { var permutation = new LightingPermutation { LightBindings = { new Light() } }; effect.Permutations.Set(LightingPermutation.Key, permutation); } if (engineContext.InputManager.IsKeyPressed(Keys.F9)) { effect.Permutations.Set(ShadowMapPermutationArray.Key, groups2[(groupIndex2++) % groups2.Length]); } } }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); renderingSetup.RegisterLighting(engineContext); #if PARADOX_YEBIS YebisPlugin yebisPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("YebisPlugin", out yebisPlugin)) { yebisPlugin.Glare.Enable = true; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; } #endif EffectOld effect = engineContext.RenderContext.BuildEffect("SimpleCube") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoSpecularBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoDiffuseBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("NormalVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("SpecularPowerPerMesh") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("PositionVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFDiffuseLambert") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFSpecularBlinnPhong") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream")) }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColorSynthetic")) }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new GBufferShaderPlugin { RenderPassPlugin = (GBufferPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("GBufferPlugin") }) .Using(new LightingShaderPlugin() { RenderPassPlugin = (LightingPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPlugin") }) .Using(new BasicShaderPlugin("LightDirectionalShading") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) ; var shadowMap1 = new ShadowMap(new DirectionalLight() { LightColor = new Color3(1.0f, 1.0f, 1.0f), LightDirection = new Vector3(1.0f, 1.0f, 1.0f) }); effect.Permutations.Set(ShadowMapPermutationArray.Key, new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }); var r = new Random(0); VirtualFileSystem.MountFileSystem("/global_data", "..\\..\\deps\\data\\"); VirtualFileSystem.MountFileSystem("/global_data2", "..\\..\\data\\"); SkyBoxPlugin skyBoxPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("SkyBoxPlugin", out skyBoxPlugin)) { var skyBoxTexture = (Texture2D)await engineContext.AssetManager.LoadAsync <Texture>("/global_data/gdc_demo/bg/GDC2012_map_sky.dds"); skyBoxPlugin.Texture = skyBoxTexture; } var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(10000, 10000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new Vector3(0, 0, 0))); var meshData = MeshDataHelper.CreateSphere(200, 30, 30, Color.Gray); var sphereMesh = new EffectMesh(effect, meshData); sphereMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new Vector3(0, 0, 50))); sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, 0f); sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, Color.White); effectMeshGroup.AddMesh(sphereMesh); //while (true) //{ // await Scheduler.Current.WaitFrame(); // for (int iy = 0; iy < sizeY; iy++) // { // for (int ix = 0; ix < sizeX; ix++) // { // var iFactor = (float)(iy * sizeY + ix) / (sizeX * sizeY); // var sphere = spheres[iy, ix]; // var sphereMesh = sphere.Mesh; // var specularColor = R8G8B8A8.SmoothStep(R8G8B8A8.GreenYellow, R8G8B8A8.Gray, iFactor); // // Matrix.RotationX((float)Math.PI/2.0f) * M // sphereMesh.Parameters.Set( // TransformationKeys.World, // Matrix.Translation( // new R32G32B32_Float( // (ix - sizeX / 2) * (size * 1.2f) * 2.0f, // (iy - sizeY / 2) * (size * 1.2f) * 2.0f, // (float)(2000 * (0.5 + 0.5 * Math.Sin(clock.ElapsedMilliseconds / 1000.0f * sphere.Speed * 0.5f + Math.PI * sphere.Phase)))))); // sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, iFactor * 0.9f); // sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, specularColor); // } // } // time = clock.ElapsedMilliseconds / 1000.0f; // if (lightInfo.Length > 0) // { // int index = 0; // foreach (var mesh in effectLight.Meshes) // { // mesh.Parameters.Set(LightKeys.LightPosition, new R32G32B32_Float(lightInfo[index].Radius * (float)Math.Cos(-time * 0.17f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(-time * 0.05f + lightInfo[index].Phase), lightInfo[index].Z * (0.5f + 0.5f * (float)Math.Sin(-time * 0.1f + lightInfo[index].Phase * 2.0f)))); // index++; // } // } //} }
public static async Task Run(EngineContext engineContext) { var renderingSetup = new RenderingSetup(); renderingSetup.Initialize(engineContext); var device = engineContext.RenderContext.GraphicsDevice; var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); EffectOld linearEffect = engineContext.RenderContext.BuildEffect("LinearColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "0"))); var linearMesh = new EffectMesh(linearEffect); renderingSetup.LinearColorPlugin.RenderPass.AddPass(linearMesh.EffectMeshPasses[0].EffectPass); var linearTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.RenderTarget); linearMesh.Parameters.Set(RenderTargetKeys.RenderTarget, linearTexture.ToRenderTarget()); effectMeshGroup.AddMesh(linearMesh); EffectOld reinhardColor = engineContext.RenderContext.BuildEffect("ReinhardColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "1"))); var reinhardMesh = new EffectMesh(reinhardColor); renderingSetup.ReinhardColorPlugin.RenderPass.AddPass(reinhardMesh.EffectMeshPasses[0].EffectPass); var reinhardTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.RenderTarget); reinhardMesh.Parameters.Set(RenderTargetKeys.RenderTarget, reinhardTexture.ToRenderTarget()); effectMeshGroup.AddMesh(reinhardMesh); var yebisTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R8G8B8A8_UNorm, TextureFlags.RenderTarget); #if PARADOX_YEBIS var yebisPlugin = renderingSetup.YebisPlugin; yebisPlugin.RenderSource = reinhardTexture; yebisPlugin.RenderTarget = yebisTexture.ToRenderTarget(); yebisPlugin.Glare.Enable = false; yebisPlugin.Lens.Vignette.Enable = false; yebisPlugin.Lens.Distortion.Enable = false; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; yebisPlugin.ToneMap.Type = ToneMapType.Reinhard; engineContext.RenderContext.Register(yebisPlugin); #endif EffectOld filmicEffect = engineContext.RenderContext.BuildEffect("FilmicColor") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComputeToneMap", "2"))); var filmicMesh = new EffectMesh(filmicEffect); renderingSetup.FilmicColorPlugin.RenderPass.AddPass(filmicMesh.EffectMeshPasses[0].EffectPass); var filmicTexture = Texture2D.New(engineContext.RenderContext.GraphicsDevice, 512, 512, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget); filmicTexture.Name = "FilmicTexture"; filmicMesh.Parameters.Set(RenderTargetKeys.RenderTarget, filmicTexture.ToRenderTarget()); effectMeshGroup.AddMesh(filmicMesh); EffectOld mainEffect = engineContext.RenderContext.BuildEffect("ComposeToneMap") .Using(new PostEffectShaderPlugin()) .Using(new BasicShaderPlugin(new ShaderClassSource("ComposeToneMap"))); var mainMesh = new EffectMesh(mainEffect); renderingSetup.MainPlugin.RenderPass.AddPass(mainMesh.EffectMeshPasses[0].EffectPass); mainMesh.Parameters.Set(TexturingKeys.Texture0, linearTexture); mainMesh.Parameters.Set(TexturingKeys.Texture2, yebisTexture); mainMesh.Parameters.Set(TexturingKeys.Texture3, filmicTexture); mainMesh.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); effectMeshGroup.AddMesh(mainMesh); }
public static async Task SetupPostEffects(EngineContext engineContext) { var config = AppConfig.GetConfiguration <Config>("Script1"); var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); bool bloom = config.Bloom; bool fxaa = config.FXAA; bool useHBAO = false; bool doBlur = true; bool mixAOWithColorImage = false; bool halfResAO = true; var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); PostEffectPlugin postEffectPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("PostEffectPlugin", out postEffectPlugin) && (bloom || fxaa || useHBAO)) { if (bloom) { // Create various effects required by the bloom effect EffectOld brightPassFilter = engineContext.RenderContext.BuildEffect("BrightPass") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")) .Using(new BasicShaderPlugin("PostEffectBrightFilter")); EffectOld blurEffect = engineContext.RenderContext.BuildEffect("Blur") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("PostEffectBlur")); EffectOld downsampleEffect = engineContext.RenderContext.BuildEffect("DownSample") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")); EffectOld mixEffect = engineContext.RenderContext.BuildEffect("Mix") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")) .Using(new BasicShaderPlugin("PosteffectTexturing2")); EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect("Fxaa") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("PostEffectFXAA.xksl")); // Create post effect meshes: downsampling and blurs int bloomLevels = 6; var downsampleMeshes = new EffectMesh[bloomLevels]; var lastBlurs = new EffectMesh[bloomLevels]; for (int i = 0; i < bloomLevels; ++i) { downsampleMeshes[i] = new EffectMesh(i == 0 ? brightPassFilter : downsampleEffect, name: "Downsample " + i); postEffectPlugin.AddEffectMesh(downsampleMeshes[i]); // Blur effect var blurQuadMesh = new EffectMesh[2]; for (int j = 0; j < 2; ++j) { blurQuadMesh[j] = new EffectMesh(blurEffect, name: string.Format("Blur level {0}:{1}", i, j)); blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Coefficients, new[] { 0.30f, 0.20f, 0.20f, 0.15f, 0.15f }); var unit = j == 0 ? Vector2.UnitX : Vector2.UnitY; blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Offsets, new[] { Vector2.Zero, unit * -1.3862832f, unit * +1.3862832f, unit * -3.2534592f, unit * +3.2534592f }); postEffectPlugin.AddEffectMesh(blurQuadMesh[j]); } lastBlurs[i] = blurQuadMesh[1]; postEffectPlugin.AddLink(downsampleMeshes[i], RenderTargetKeys.RenderTarget, blurQuadMesh[0], TexturingKeys.Texture0, new TextureDescription { Width = 1024 >> (i + 1), Height = 768 >> (i + 1), Format = PixelFormat.R8G8B8A8_UNorm }); postEffectPlugin.AddLink(blurQuadMesh[0], RenderTargetKeys.RenderTarget, blurQuadMesh[1], TexturingKeys.Texture0); if (i > 0) { postEffectPlugin.AddLink(downsampleMeshes[i - 1], RenderTargetKeys.RenderTarget, downsampleMeshes[i], TexturingKeys.Texture0); } } // Create post effect meshes: mix EffectMesh lastMix = null; for (int i = 0; i < bloomLevels; ++i) { var mixMesh = new EffectMesh(mixEffect, name: "Mix " + (bloomLevels - 1 - i)); mixMesh.Parameters.Set(PostEffectKeys.MixCoefficients, (i < bloomLevels - 1) ? new[] { 0.10f, 0.90f } : new[] { 1.0f, 3.0f }); postEffectPlugin.AddEffectMesh(mixMesh); if (i < bloomLevels - 1) { postEffectPlugin.AddLink(lastBlurs[bloomLevels - 2 - i], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture0); } postEffectPlugin.AddLink(lastMix ?? lastBlurs[bloomLevels - 1], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture2); lastMix = mixMesh; } EffectMesh lastEffectMesh = lastMix; //add fxaa? if (fxaa) { var fxaaQuadMesh = new EffectMesh(fxaaEffect, name: "FXAA level"); postEffectPlugin.AddEffectMesh(fxaaQuadMesh); postEffectPlugin.AddLink(lastMix, RenderTargetKeys.RenderTarget, fxaaQuadMesh, TexturingKeys.Texture0, new TextureDescription { Width = 1024, Height = 768, Format = PixelFormat.R8G8B8A8_UNorm }); lastEffectMesh = fxaaQuadMesh; } engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) => { var renderTarget = renderingSetup.MainTargetPlugin.RenderTarget; //blurQuadMesh[0].Parameters.Set(TextureFeature.Texture0, renderTarget); //blurQuadMesh[1].Parameters.Set(RenderTargetKeys.RenderTarget, renderTarget); downsampleMeshes[0].Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (Texture2D)renderTarget.Texture); lastMix.Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (Texture2D)renderTarget.Texture); lastMix.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); lastEffectMesh.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); }); } else if (fxaa) { //fxaa effect setup (fxaa only, no bloom effect) EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect("Fxaa") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("..\\..\\sources\\shaders\\posteffect_fxaa.xksl")); var fxaaQuadMesh = new EffectMesh(fxaaEffect, name: "FXAA level"); fxaaQuadMesh.Parameters.Set(TexturingKeys.Texture0, (Texture2D)renderingSetup.MainTargetPlugin.RenderTarget.Texture); fxaaQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); //fxaaQuadMesh.Parameters.Set(PostEffectFXAAKeys.FxaaQualitySubpix, 0); postEffectPlugin.AddEffectMesh(fxaaQuadMesh); //TODO, application will crashes if we resize or move the window!! } foreach (var mesh in postEffectPlugin.Meshes) { effectMeshGroup.AddMesh(mesh); } //engineContext.RenderContext.RootRenderPass.AddPass(postEffectPlugin.RenderPass); engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) => { // Link post effects (this will create intermediate surfaces) postEffectPlugin.Resolve(); }); } }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); renderingSetup.RegisterLighting(engineContext); #if PARADOX_YEBIS YebisPlugin yebisPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("YebisPlugin", out yebisPlugin)) { yebisPlugin.Glare.Enable = true; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; } #endif EffectOld effect = engineContext.RenderContext.BuildEffect("SimpleCube") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoSpecularBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoDiffuseBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("NormalVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("SpecularPowerPerMesh") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("PositionVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFDiffuseLambert") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFSpecularBlinnPhong") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream"))}) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColorSynthetic"))}) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new GBufferShaderPlugin { RenderPassPlugin = (GBufferPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("GBufferPlugin") }) .Using(new LightingShaderPlugin() { RenderPassPlugin = (LightingPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPlugin") }) .Using(new BasicShaderPlugin("LightDirectionalShading") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) ; var shadowMap1 = new ShadowMap(new DirectionalLight() { LightColor = new Color3(1.0f, 1.0f, 1.0f), LightDirection = new Vector3(1.0f, 1.0f, 1.0f) }); effect.Permutations.Set(ShadowMapPermutationArray.Key, new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }); var r = new Random(0); VirtualFileSystem.MountFileSystem("/global_data", "..\\..\\deps\\data\\"); VirtualFileSystem.MountFileSystem("/global_data2", "..\\..\\data\\"); SkyBoxPlugin skyBoxPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("SkyBoxPlugin", out skyBoxPlugin)) { var skyBoxTexture = (Texture2D)await engineContext.AssetManager.LoadAsync<Texture>("/global_data/gdc_demo/bg/GDC2012_map_sky.dds"); skyBoxPlugin.Texture = skyBoxTexture; } var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(10000, 10000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new Vector3(0, 0, 0))); var meshData = MeshDataHelper.CreateSphere(200, 30, 30, Color.Gray); var sphereMesh = new EffectMesh(effect, meshData); sphereMesh.Parameters.Set(TransformationKeys.World,Matrix.Translation(new Vector3(0, 0, 50))); sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, 0f); sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, Color.White); effectMeshGroup.AddMesh(sphereMesh); //while (true) //{ // await Scheduler.Current.WaitFrame(); // for (int iy = 0; iy < sizeY; iy++) // { // for (int ix = 0; ix < sizeX; ix++) // { // var iFactor = (float)(iy * sizeY + ix) / (sizeX * sizeY); // var sphere = spheres[iy, ix]; // var sphereMesh = sphere.Mesh; // var specularColor = R8G8B8A8.SmoothStep(R8G8B8A8.GreenYellow, R8G8B8A8.Gray, iFactor); // // Matrix.RotationX((float)Math.PI/2.0f) * M // sphereMesh.Parameters.Set( // TransformationKeys.World, // Matrix.Translation( // new R32G32B32_Float( // (ix - sizeX / 2) * (size * 1.2f) * 2.0f, // (iy - sizeY / 2) * (size * 1.2f) * 2.0f, // (float)(2000 * (0.5 + 0.5 * Math.Sin(clock.ElapsedMilliseconds / 1000.0f * sphere.Speed * 0.5f + Math.PI * sphere.Phase)))))); // sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, iFactor * 0.9f); // sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, specularColor); // } // } // time = clock.ElapsedMilliseconds / 1000.0f; // if (lightInfo.Length > 0) // { // int index = 0; // foreach (var mesh in effectLight.Meshes) // { // mesh.Parameters.Set(LightKeys.LightPosition, new R32G32B32_Float(lightInfo[index].Radius * (float)Math.Cos(-time * 0.17f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(-time * 0.05f + lightInfo[index].Phase), lightInfo[index].Z * (0.5f + 0.5f * (float)Math.Sin(-time * 0.1f + lightInfo[index].Phase * 2.0f)))); // index++; // } // } //} }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); renderingSetup.RegisterLighting(engineContext); #if XENKO_YEBIS YebisPlugin yebisPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("YebisPlugin", out yebisPlugin)) { yebisPlugin.Glare.Enable = true; yebisPlugin.ToneMap.Exposure = 1.0f; yebisPlugin.ToneMap.Gamma = 2.2f; } #endif var lightPrepassPlugin = (LightingPrepassPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPrepassPlugin"); var gbufferPlugin = (GBufferPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("GBufferPlugin"); EffectOld effect = engineContext.RenderContext.BuildEffect("SimpleCube") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoSpecularBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("AlbedoDiffuseBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("NormalVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("SpecularPowerPerMesh") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("PositionVSGBuffer") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFDiffuseLambert") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("BRDFSpecularBlinnPhong") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream"))}) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColorSynthetic"))}) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new GBufferShaderPlugin { RenderPassPlugin = gbufferPlugin }) .Using(new DeferredLightingShaderPlugin() { RenderPassPlugin = lightPrepassPlugin }) .Using(new LightingShaderPlugin() { RenderPassPlugin = (LightingPlugin)engineContext.DataContext.RenderPassPlugins.TryGetValue("LightingPlugin") }) .Using(new BasicShaderPlugin("LightDirectionalShading") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) ; var shadowMap1 = new ShadowMap(new DirectionalLight() { LightColor = new Color3(1.0f, 1.0f, 1.0f), LightDirection = new Vector3(1.0f, 1.0f, 1.0f) }); effect.Permutations.Set(ShadowMapPermutationArray.Key, new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }); var r = new Random(0); VirtualFileSystem.MountFileSystem("/global_data", "..\\..\\deps\\data\\"); VirtualFileSystem.MountFileSystem("/global_data2", "..\\..\\data\\"); SkyBoxPlugin skyBoxPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("SkyBoxPlugin", out skyBoxPlugin)) { var skyBoxTexture = (Texture2D)await engineContext.AssetManager.LoadAsync<Texture>("/global_data/gdc_demo/bg/GDC2012_map_sky.dds"); skyBoxPlugin.Texture = skyBoxTexture; } var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(10000, 10000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new Vector3(0, 0, 0))); // Lights for (int i = 0; i < 1024; ++i) { Color3 color = (Color3)Color.White; switch (i % 4) { case 0: color = (Color3)Color.DarkOrange; break; case 1: color = (Color3)Color.DarkGoldenrod; break; case 2: color = (Color3)Color.DarkSalmon; break; case 3: color = (Color3)Color.DarkRed; break; } var effectMesh = new EffectMesh(lightPrepassPlugin.Lights); effectMesh.Parameters.Set(LightKeys.LightRadius, (float)r.NextDouble() * 200 + 200.0f); effectMesh.Parameters.Set(LightKeys.LightColor, color); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(effectMesh); } EffectOld effectLight = lightPrepassPlugin.Lights; var lightInfo = new LightInfo[effectLight != null ? effectLight.Meshes.Count : 0]; for (int i = 0; i < lightInfo.Length; ++i) { lightInfo[i].Radius = (float)r.NextDouble() * 7000.0f + 500.0f; lightInfo[i].Phase = (float)(r.NextDouble() * Math.PI * 2.0); lightInfo[i].Z = (float)r.NextDouble() * 3000.0f; ; } float time = 0.0f; // Meshes (quad) that will later be generated by the engine (light pre pass, SSAO, etc...) // Lights //var effectMesh = new EffectMesh(setup.LightingPrepassPlugin.Lights); //effectMesh.Parameters.Set(LightKeys.LightRadius, 1000.0f); //effectMesh.Parameters.Set(LightKeys.LightColor, new R32G32B32_Float(1.0f, 1.0f, 1.0f)); //effectMesh.Parameters.Set(LightKeys.LightPosition, new R32G32B32_Float(0, 0, 1200)); //effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); //effectMeshGroup.AddMesh(effectMesh); //var boxMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(300, R8G8B8A8.LightBlue)); //boxMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); //boxMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(new R32G32B32_Float(0, 0, 200))); //effectMeshGroup.AddMesh(boxMesh); var clock = new Stopwatch(); clock.Start(); int sizeX = 10; int sizeY = 10; var spheres = new Sphere[sizeY,sizeX]; Random random = new Random(0); int size = 200; var meshData = MeshDataHelper.CreateSphere(size, 30, 30, Color.Gray); for (int iy = 0; iy < sizeY; iy++) { for (int ix = 0; ix < sizeX; ix++) { var sphere = new Sphere(); sphere.Mesh = new EffectMesh(effect, meshData); sphere.Phase = (float)random.NextDouble(); sphere.Speed = (float)random.NextDouble(); spheres[iy, ix] = sphere; effectMeshGroup.AddMesh(sphere.Mesh); } } while (true) { await Scheduler.Current.NextFrame(); for (int iy = 0; iy < sizeY; iy++) { for (int ix = 0; ix < sizeX; ix++) { var iFactor = (float)(iy * sizeY + ix) / (sizeX * sizeY); var sphere = spheres[iy, ix]; var sphereMesh = sphere.Mesh; var specularColor = Color.SmoothStep(Color.GreenYellow, Color.Gray, iFactor); // Matrix.RotationX((float)Math.PI/2.0f) * M sphereMesh.Parameters.Set( TransformationKeys.World, Matrix.Translation( new Vector3( (ix - sizeX / 2) * (size * 1.2f) * 2.0f, (iy - sizeY / 2) * (size * 1.2f) * 2.0f, (float)(2000 * (0.5 + 0.5 * Math.Sin(clock.ElapsedMilliseconds / 1000.0f * sphere.Speed * 0.5f + Math.PI * sphere.Phase)))))); sphereMesh.Parameters.Set(MaterialKeys.SpecularPower, iFactor * 0.9f); sphereMesh.Parameters.Set(MaterialKeys.SpecularColor, specularColor); } } time = clock.ElapsedMilliseconds / 1000.0f; if (lightInfo.Length > 0) { int index = 0; foreach (var mesh in effectLight.Meshes) { mesh.Parameters.Set(LightKeys.LightPosition, new Vector3(lightInfo[index].Radius * (float)Math.Cos(-time * 0.17f + lightInfo[index].Phase), lightInfo[index].Radius * (float)Math.Sin(-time * 0.05f + lightInfo[index].Phase), lightInfo[index].Z * (0.5f + 0.5f * (float)Math.Sin(-time * 0.1f + lightInfo[index].Phase * 2.0f)))); index++; } } } }
public static async Task SetupPostEffects(EngineContext engineContext) { var config = AppConfig.GetConfiguration<Config>("Script1"); var renderingSetup = RenderingSetup.Singleton; renderingSetup.Initialize(engineContext); bool bloom = config.Bloom; bool fxaa = config.FXAA; bool useHBAO = false; bool doBlur = true; bool mixAOWithColorImage = false; bool halfResAO = true; var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); PostEffectPlugin postEffectPlugin; if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast("PostEffectPlugin", out postEffectPlugin) && (bloom || fxaa || useHBAO)) { if (bloom) { // Create various effects required by the bloom effect EffectOld brightPassFilter = engineContext.RenderContext.BuildEffect("BrightPass") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")) .Using(new BasicShaderPlugin("PostEffectBrightFilter")); EffectOld blurEffect = engineContext.RenderContext.BuildEffect("Blur") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("PostEffectBlur")); EffectOld downsampleEffect = engineContext.RenderContext.BuildEffect("DownSample") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")); EffectOld mixEffect = engineContext.RenderContext.BuildEffect("Mix") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("ShadingTexturing")) .Using(new BasicShaderPlugin("PosteffectTexturing2")); EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect("Fxaa") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("PostEffectFXAA.xksl")); // Create post effect meshes: downsampling and blurs int bloomLevels = 6; var downsampleMeshes = new EffectMesh[bloomLevels]; var lastBlurs = new EffectMesh[bloomLevels]; for (int i = 0; i < bloomLevels; ++i) { downsampleMeshes[i] = new EffectMesh(i == 0 ? brightPassFilter : downsampleEffect, name: "Downsample " + i); postEffectPlugin.AddEffectMesh(downsampleMeshes[i]); // Blur effect var blurQuadMesh = new EffectMesh[2]; for (int j = 0; j < 2; ++j) { blurQuadMesh[j] = new EffectMesh(blurEffect, name: string.Format("Blur level {0}:{1}", i, j)); blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Coefficients, new[] { 0.30f, 0.20f, 0.20f, 0.15f, 0.15f }); var unit = j == 0 ? Vector2.UnitX : Vector2.UnitY; blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Offsets, new[] { Vector2.Zero, unit * -1.3862832f, unit * +1.3862832f, unit * -3.2534592f, unit * +3.2534592f }); postEffectPlugin.AddEffectMesh(blurQuadMesh[j]); } lastBlurs[i] = blurQuadMesh[1]; postEffectPlugin.AddLink(downsampleMeshes[i], RenderTargetKeys.RenderTarget, blurQuadMesh[0], TexturingKeys.Texture0, new TextureDescription { Width = 1024 >> (i + 1), Height = 768 >> (i + 1), Format = PixelFormat.R8G8B8A8_UNorm }); postEffectPlugin.AddLink(blurQuadMesh[0], RenderTargetKeys.RenderTarget, blurQuadMesh[1], TexturingKeys.Texture0); if (i > 0) postEffectPlugin.AddLink(downsampleMeshes[i - 1], RenderTargetKeys.RenderTarget, downsampleMeshes[i], TexturingKeys.Texture0); } // Create post effect meshes: mix EffectMesh lastMix = null; for (int i = 0; i < bloomLevels; ++i) { var mixMesh = new EffectMesh(mixEffect, name: "Mix " + (bloomLevels - 1 - i)); mixMesh.Parameters.Set(PostEffectKeys.MixCoefficients, (i < bloomLevels - 1) ? new[] { 0.10f, 0.90f } : new[] { 1.0f, 3.0f }); postEffectPlugin.AddEffectMesh(mixMesh); if (i < bloomLevels - 1) postEffectPlugin.AddLink(lastBlurs[bloomLevels - 2 - i], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture0); postEffectPlugin.AddLink(lastMix ?? lastBlurs[bloomLevels - 1], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture2); lastMix = mixMesh; } EffectMesh lastEffectMesh = lastMix; //add fxaa? if (fxaa) { var fxaaQuadMesh = new EffectMesh(fxaaEffect, name: "FXAA level"); postEffectPlugin.AddEffectMesh(fxaaQuadMesh); postEffectPlugin.AddLink(lastMix, RenderTargetKeys.RenderTarget, fxaaQuadMesh, TexturingKeys.Texture0, new TextureDescription { Width = 1024, Height = 768, Format = PixelFormat.R8G8B8A8_UNorm }); lastEffectMesh = fxaaQuadMesh; } engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) => { var renderTarget = renderingSetup.MainTargetPlugin.RenderTarget; //blurQuadMesh[0].Parameters.Set(TextureFeature.Texture0, renderTarget); //blurQuadMesh[1].Parameters.Set(RenderTargetKeys.RenderTarget, renderTarget); downsampleMeshes[0].Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (Texture2D)renderTarget.Texture); lastMix.Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (Texture2D)renderTarget.Texture); lastMix.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); lastEffectMesh.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); }); } else if (fxaa) { //fxaa effect setup (fxaa only, no bloom effect) EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect("Fxaa") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectPlugin }) .Using(new BasicShaderPlugin("..\\..\\sources\\shaders\\posteffect_fxaa.xksl")); var fxaaQuadMesh = new EffectMesh(fxaaEffect, name: "FXAA level"); fxaaQuadMesh.Parameters.Set(TexturingKeys.Texture0, (Texture2D)renderingSetup.MainTargetPlugin.RenderTarget.Texture); fxaaQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); //fxaaQuadMesh.Parameters.Set(PostEffectFXAAKeys.FxaaQualitySubpix, 0); postEffectPlugin.AddEffectMesh(fxaaQuadMesh); //TODO, application will crashes if we resize or move the window!! } foreach (var mesh in postEffectPlugin.Meshes) effectMeshGroup.AddMesh(mesh); //engineContext.RenderContext.RootRenderPass.AddPass(postEffectPlugin.RenderPass); engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) => { // Link post effects (this will create intermediate surfaces) postEffectPlugin.Resolve(); }); } }
public static async Task Run(EngineContext engineContext) { var renderingSetup = RenderingSetup.Singleton; //engineContext.RenderContext.Register(renderingSetup.LightingPlugin); //renderingSetup.RegisterLighting(engineContext); var shadowMapPlugin = new LightingPlugin { MainPlugin = renderingSetup.MainPlugin, RenderPass = engineContext.DataContext.RenderPasses.TryGetValue("ShadowMapPass") }; shadowMapPlugin.RenderContext = engineContext.RenderContext; var shadowMap1 = new ShadowMap(new DirectionalLight()) { Level = CascadeShadowMapLevel.X1, ShadowMapSize = 1024, ShadowDistance = 2000.0f } .SetFilter(sm => new ShadowMapFilterDefault(sm)); var shadowMap2 = new ShadowMap(new DirectionalLight()) { Level = CascadeShadowMapLevel.X2, ShadowMapSize = 1024, ShadowDistance = 2000.0f } .SetFilter(sm => new ShadowMapFilterVsm(sm)); shadowMapPlugin.AddShadowMap(shadowMap1); shadowMapPlugin.AddShadowMap(shadowMap2); shadowMap1.DirectionalLight.LightDirection = new Vector3(-1.0f, -1.0f, -1.0f); shadowMap1.DirectionalLight.LightColor = new Color3(1.0f, 0.5f, 0.5f); shadowMap2.DirectionalLight.LightDirection = new Vector3(-1.0f, 1.0f, -1.0f); shadowMap2.DirectionalLight.LightColor = new Color3(0.5f, 0.5f, 1.0f); engineContext.RenderContext.Register(shadowMapPlugin); EffectOld effect = engineContext.RenderContext.BuildEffect("Permutation") .Using(new BasicShaderPlugin("ShaderBase") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new BasicShaderPlugin(new ShaderMixinSource() { "NormalVSStream", "PositionVSStream", new ShaderComposition("albedoDiffuse", new ShaderClassSource("ComputeColorStream")), new ShaderComposition("albedoSpecular", new ShaderClassSource("ComputeColor")), // TODO: Default values! "BRDFDiffuseLambert", "BRDFSpecularBlinnPhong", "ShadingBase", }) { RenderPassPlugin = renderingSetup.MainTargetPlugin }) .Using(new LightingShaderPlugin() { RenderPassPlugin = shadowMapPlugin }) ; var sphereMeshData = MeshDataHelper.CreateSphere(10.0f, 20, 20, Color.White); var effectMeshGroup = new RenderPassListEnumerator(); engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup); int objectSqrtCount = 1; int meshCount = objectSqrtCount * objectSqrtCount * objectSqrtCount; var shadowMapPermutation1 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap1 } }; var shadowMapPermutation2 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap2 } }; var shadowMapPermutation3 = new ShadowMapPermutationArray { ShadowMaps = { shadowMap1, shadowMap2 } }; effect.Permutations.Set(ShadowMapPermutationArray.Key, shadowMapPermutation1); var groups2 = new[] { shadowMapPermutation1, shadowMapPermutation2, shadowMapPermutation3 }; int groupIndex2 = 0; var effectMeshes = new List <EffectMesh>(); for (int j = 0; j < meshCount; ++j) { var effectMesh = new EffectMesh(effect, sphereMeshData); effectMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effect.Permutations.Set(ShadowMapPermutationArray.Key, groups2[2]); var w2 = Matrix.Scaling(1.0f) * Matrix.Translation(new Vector3( (j % objectSqrtCount - objectSqrtCount / 2) * 30.0f - 30.0f, (((j / objectSqrtCount) % objectSqrtCount) - objectSqrtCount / 2) * 30.0f - 30.0f, (j / (objectSqrtCount * objectSqrtCount)) * 30.0f + 30.0f)); effectMesh.Parameters.Set(TransformationKeys.World, w2); effectMeshes.Add(effectMesh); } var groundMesh = new EffectMesh(effect, MeshDataHelper.CreateBox(1000, 1000, 1, Color.White)); groundMesh.KeepAliveBy(engineContext.SimpleComponentRegistry); effectMeshGroup.AddMesh(groundMesh); groundMesh.Parameters.Set(TransformationKeys.World, Matrix.Translation(0.0f, 0.0f, 0.0f)); var groups = new[] { new int[] { 0, 1 }, new int[] { 0 }, new int[] { 1 } }; int groupIndex = 0; await TaskEx.Delay(1000); foreach (var effectMesh in effectMeshes) { effectMeshGroup.AddMesh(effectMesh); } while (true) { await engineContext.Scheduler.NextFrame(); if (engineContext.InputManager.IsKeyPressed(Keys.F8)) { var permutation = new LightingPermutation { LightBindings = { new Light() } }; effect.Permutations.Set(LightingPermutation.Key, permutation); } if (engineContext.InputManager.IsKeyPressed(Keys.F9)) { effect.Permutations.Set(ShadowMapPermutationArray.Key, groups2[(groupIndex2++) % groups2.Length]); } } }
public override void Load() { base.Load(); var postEffectsPlugin = new PostEffectGraphPlugin("PostEffectPlugin") { RenderPass = RenderPass }; EffectOld hbaoEffect = this.EffectSystemOld.BuildEffect("HBAO") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin }) .Using(new BasicShaderPlugin(new ShaderClassSource("PostEffectHBAO") { GenericArguments = new object[] { UseNormal ? 1 : 0, (int)Quality } })) .KeepAliveBy(ActiveObjects) .InstantiatePermutation() .KeepAliveBy(ActiveObjects); // Parameters.AddSources(MainPlugin.ViewParameters); if (OfflineCompilation) return; var colorTexture = (Texture2D)GBufferPlugin.MainTargetPlugin.RenderTarget.Texture; bool doBlur = true; bool halfResAO = false; //================================================= //Add hbao pass //========================================== //HBAO params int HBAO_numDir = 16; //TODO: should we recreate the random texture if we change this parameter? //========================================== //Create random texture var rng = new Random(0); Vector3[] tab = new Vector3[64 * 64]; for (int i = 0; i < 64 * 64; i++) { float angle = (float)(2.0 * Math.PI * rng.NextDouble()) / (float)HBAO_numDir; Vector3 sample = new Vector3( (float)Math.Cos(angle), (float)Math.Sin(angle), (float)rng.NextDouble() ); tab[i] = sample; } var randomTexture = Texture.New2D(GraphicsDevice, 64, 64, PixelFormat.R32G32B32_Float, tab); var hbaoQuadMesh = new EffectMesh(hbaoEffect, name: "HBAO level").KeepAliveBy(ActiveObjects); //var renderTarget = renderingSetup.MainPlugin.RenderTarget; hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RandomTexture, randomTexture); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountDirection, CountDirection); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountStepMax, CountStepMax); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Radius, Radius); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Attenuation, Attenuation); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.AngleBias, AngleBias * (float)Math.PI / 180.0f); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Contrast, Contrast); hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RenderTargetResolutionRatio, halfResAO ? 0.5f : 1.0f); hbaoQuadMesh.Parameters.Set(GBufferBaseKeys.GBufferTexture, GBufferPlugin.GBufferTexture); hbaoQuadMesh.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); if (!doBlur) { var aoRenderTarget = Texture.New2D(GraphicsDevice, GraphicsDevice.BackBuffer.Width, GraphicsDevice.BackBuffer.Height, PixelFormat.R8_UNorm, TextureFlags.RenderTarget).ToRenderTarget().KeepAliveBy(ActiveObjects); aoRenderTarget.Name = "AOTexture"; hbaoQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, aoRenderTarget); } else { EffectOld hbaoBlurEffect = this.EffectSystemOld.BuildEffect("HBAO Blur") .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin }) .Using(new BasicShaderPlugin("PostEffectHBAOBlur")) .InstantiatePermutation(); //===================================================================== //BlurX EffectMesh hbaoBlurQuadMeshX = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur X level"); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(1, 0)); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture); hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, false); hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); //TODO: check the format (RGB 8 bits, or Float or half-float?) //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms! var backBuffer = GraphicsDevice.BackBuffer; postEffectsPlugin.AddLink( hbaoQuadMesh, RenderTargetKeys.RenderTarget, hbaoBlurQuadMeshX, PostEffectHBAOBlurKeys.AmbiantOcclusionTexture, new TextureDescription() { Width = backBuffer.Width >> (halfResAO ? 1 : 0), Height = backBuffer.Height >> (halfResAO ? 1 : 0), Format = PixelFormat.R8_UNorm }); //hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget); //===================================================================== //BlurY EffectMesh hbaoBlurQuadMeshY = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur Y level"); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(0, 1)); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture); hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, !Debug); hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture); //TODO: check the format (RGB 8 bits, or Float or half-float?) //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms! postEffectsPlugin.AddLink( hbaoBlurQuadMeshX, RenderTargetKeys.RenderTarget, hbaoBlurQuadMeshY, PostEffectHBAOBlurKeys.AmbiantOcclusionTexture, new TextureDescription { Width = backBuffer.Width, Height = backBuffer.Height, Format = PixelFormat.R8_UNorm }); hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.RenderTarget, RenderTarget); } var effectMeshGroup = new RenderPassListEnumerator(); foreach (var mesh in postEffectsPlugin.Meshes) RenderSystem.GlobalMeshes.AddMesh(mesh); // Link post effects (this will create intermediate surfaces) postEffectsPlugin.Resolve(); }