internal static void DrawDebugBlendedRenderTargets() { BlendState.Opaque.Apply(); // All RT should be of same size, so for size we can use any of them we just pick up depthRT float renderTargetAspectRatio = (float)MyCamera.Viewport.Width / (float)MyCamera.Viewport.Height; float normalizedSizeY = 0.40f; //float normalizedSizeY = MyCamera.Viewport.Height / 1920f; float normalizedSizeX = normalizedSizeY * renderTargetAspectRatio; MyMwcVector2Int delta = new MyMwcVector2Int((int)(MyCamera.Viewport.Height * 0.015f), (int)(MyCamera.Viewport.Height * 0.015f)); MyMwcVector2Int size = new MyMwcVector2Int((int)(MyCamera.Viewport.Height * normalizedSizeX), (int)(MyCamera.Viewport.Height * normalizedSizeY)); MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.Diffuse), delta.X, delta.Y, size.X, size.Y, Color.White); MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.Normals), delta.X + size.X + delta.X, delta.Y, size.X, size.Y, Color.White); }
internal static void DrawDebugEnvironmentRenderTargets() { BlendState.Opaque.Apply(); int cubeSize = GetRenderTargetCube(MyRenderTargets.EnvironmentCube).GetLevelDescription(0).Width; cubeSize = 128; MyMwcVector2Int delta = new MyMwcVector2Int((int)(MyCamera.Viewport.Height * 0.07f), (int)(MyCamera.Viewport.Height * 0.015f)); MyMwcVector2Int size = new MyMwcVector2Int(cubeSize, cubeSize); int heightOffset = size.Y + delta.Y; for (int i = 0; i < 6; i++) { //var back = MyTextureManager.GetTexture<MyTextureCube>("Textures\\BackgroundCube\\Final\\TestCube", null, MinerWars.AppCode.Game.Managers.LoadingMode.Immediate); MyGuiManager.DrawSpriteFast(GetRenderTargetCube(MyRenderTargets.EnvironmentCube), (CubeMapFace)i, delta.X + size.X * i, delta.Y, size.X, size.Y, Color.White); MyGuiManager.DrawSpriteFast(GetRenderTargetCube(MyRenderTargets.EnvironmentCubeAux), (CubeMapFace)i, delta.X + size.X * i, delta.Y + heightOffset, size.X, size.Y, Color.White); MyGuiManager.DrawSpriteFast(GetRenderTargetCube(MyRenderTargets.AmbientCube), (CubeMapFace)i, delta.X + size.X * i, delta.Y + heightOffset * 2, size.X, size.Y, Color.White); MyGuiManager.DrawSpriteFast(GetRenderTargetCube(MyRenderTargets.AmbientCubeAux), (CubeMapFace)i, delta.X + size.X * i, delta.Y + heightOffset * 3, size.X, size.Y, Color.White); } }
/// <summary> /// Render method is called directly by renderer. Depending on stage, post process can do various things /// </summary> /// <param name="postProcessStage">Stage indicating in which part renderer currently is.</param>public override void RenderAfterBlendLights() public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget) { switch (postProcessStage) { case PostProcessStage.LODBlend: { MyEffectVolumetricSSAO2 volumetricSsao = MyRender.GetEffect(MyEffects.VolumetricSSAO) as MyEffectVolumetricSSAO2; int width = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Width; int height = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Height; int halfWidth = width / 2; int halfHeight = height / 2; //Render SSAO MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAO), null); MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.Target, new SharpDX.ColorBGRA(0), 1, 0); DepthStencilState.None.Apply(); BlendState.Opaque.Apply(); Vector4 ssaoParams = new Vector4(MinRadius, MaxRadius, RadiusGrowZScale, CameraZFar); Vector4 ssaoParams2 = new Vector4(Bias, Falloff, NormValue, 0); volumetricSsao.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); volumetricSsao.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals)); volumetricSsao.SetHalfPixel(width, height); volumetricSsao.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners()); volumetricSsao.SetViewMatrix(MyCamera.ViewMatrixAtZero); volumetricSsao.SetParams1(ssaoParams); volumetricSsao.SetParams2(ssaoParams2); volumetricSsao.SetProjectionMatrix(MyCamera.ProjectionMatrix); volumetricSsao.SetContrast(Contrast); MyGuiManager.GetFullscreenQuad().Draw(volumetricSsao); if (volumetricSsao.UseBlur) { //SSAO Blur MyMinerGame.SetRenderTarget(availableRenderTarget, null); MyEffectSSAOBlur2 effectSsaoBlur = MyRender.GetEffect(MyEffects.SSAOBlur) as MyEffectSSAOBlur2; effectSsaoBlur.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth)); //effectSsaoBlur.SetNormalsRT(MyRender.GetRenderTarget(MyRenderTargets.Normals)); effectSsaoBlur.SetHalfPixel(width, height); effectSsaoBlur.SetSSAOHalfPixel(halfWidth, halfHeight); effectSsaoBlur.SetSsaoRT(MyRender.GetRenderTarget(MyRenderTargets.SSAO)); effectSsaoBlur.SetBlurDirection(new Vector2(0, 1f / (float)halfHeight)); //effectSsaoBlur.SetBlurDirection(new Vector2(1 / (float)halfWidth, 1f / (float)halfHeight)); MyGuiManager.GetFullscreenQuad().Draw(effectSsaoBlur); MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), null); effectSsaoBlur.SetSsaoRT(availableRenderTarget); effectSsaoBlur.SetBlurDirection(new Vector2(1f / (float)halfWidth, 0)); MyGuiManager.GetFullscreenQuad().Draw(effectSsaoBlur); } //Bake it into diffuse /* * MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; * MyMinerGame.SetRenderTarget(availableRenderTarget, null); * ssEffect.SetSourceTexture(MyRender.GetRenderTarget(MyRenderTargets.Diffuse)); * ssEffect.SetScale(Vector2.One); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); * */ MyMinerGame.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.Diffuse), null); /* * ssEffect.SetSourceTexture(availableRenderTarget); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * ssEffect.SetScale(Vector2.One); * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); */ MyEffectVolumetricSSAO2 effectVolumetricSsao = MyRender.GetEffect(MyEffects.VolumetricSSAO) as MyEffectVolumetricSSAO2; //Blend with SSAO together DepthStencilState.None.Apply(); if (!effectVolumetricSsao.ShowOnlySSAO) { MyStateObjects.SSAO_BlendState.Apply(); } else { MyRender.CurrentRenderSetup.EnableLights = false; MyMinerGame.Static.GraphicsDevice.Clear(ClearFlags.Target, new SharpDX.ColorBGRA(1.0f), 1, 0); MyStateObjects.SSAO_BlendState.Apply(); } if (effectVolumetricSsao.UseBlur) { MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), 0, 0, MyCamera.Viewport.Width, MyCamera.Viewport.Height, Color.White); } else { MyGuiManager.DrawSpriteFast(MyRender.GetRenderTarget(MyRenderTargets.SSAO), 0, 0, MyCamera.Viewport.Width, MyCamera.Viewport.Height, Color.White); } } break; } return(source); }