internal static void DrawDebugEnvironmentRenderTargets() { BlendState.Opaque.Apply(); int cubeSize = GetRenderTargetCube(MyRenderTargets.EnvironmentCube).GetLevelDescription(0).Width; cubeSize = 128; Vector2I delta = new Vector2I((int)(MyRenderCamera.Viewport.Height * 0.07f), (int)(MyRenderCamera.Viewport.Height * 0.015f)); Vector2I size = new Vector2I(cubeSize, cubeSize); int heightOffset = size.Y + delta.Y; MyRender.BeginSpriteBatch(BlendState.Opaque); for (int i = 0; i < 6; i++) { //var back = MyTextureManager.GetTexture<MyTextureCube>("Textures\\BackgroundCube\\Final\\TestCube", null, AppCode.Game.Managers.LoadingMode.Immediate); Vector2 vz = Vector2.Zero; Rectangle? rf = null; RectangleF dest = new RectangleF(delta.X + size.X * i, delta.Y, size.X, size.Y); MyRender.DrawSprite(GetRenderTargetCube(MyRenderTargets.EnvironmentCube), (CubeMapFace)i, ref dest, false, ref rf, Color.White, Vector2.UnitX, ref vz, SpriteEffects.None, 0); dest = new RectangleF(delta.X + size.X * i, delta.Y + heightOffset, size.X, size.Y); MyRender.DrawSprite(GetRenderTargetCube(MyRenderTargets.EnvironmentCubeAux), (CubeMapFace)i, ref dest, false, ref rf, Color.White, Vector2.UnitX, ref vz, SpriteEffects.None, 0); dest = new RectangleF(delta.X + size.X * i, delta.Y + heightOffset * 2, size.X, size.Y); MyRender.DrawSprite(GetRenderTargetCube(MyRenderTargets.AmbientCube), (CubeMapFace)i, ref dest, false, ref rf, Color.White, Vector2.UnitX, ref vz, SpriteEffects.None, 0); dest = new RectangleF(delta.X + size.X * i, delta.Y + heightOffset * 3, size.X, size.Y); MyRender.DrawSprite(GetRenderTargetCube(MyRenderTargets.AmbientCubeAux), (CubeMapFace)i, ref dest, false, ref rf, Color.White, Vector2.UnitX, ref vz, SpriteEffects.None, 0); } MyRender.EndSpriteBatch(); }
/// <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 screenSizeX = width; int screenSizeY = height; //Render SSAO MyRender.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAO), null); MyRender.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(screenSizeX, screenSizeY); volumetricSsao.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners()); volumetricSsao.SetViewMatrix(MyRenderCamera.ViewMatrixAtZero); volumetricSsao.SetParams1(ssaoParams); volumetricSsao.SetParams2(ssaoParams2); volumetricSsao.SetProjectionMatrix(MyRenderCamera.ProjectionMatrix); volumetricSsao.SetContrast(Contrast); MyRender.GetFullscreenQuad().Draw(volumetricSsao); if (UseBlur) { //SSAO Blur MyRender.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(screenSizeX, screenSizeY); effectSsaoBlur.SetSsaoRT(MyRender.GetRenderTarget(MyRenderTargets.SSAO)); effectSsaoBlur.SetBlurDirection(new Vector2(0, 1f / (float)screenSizeY)); //effectSsaoBlur.SetBlurDirection(new Vector2(1 / (float)halfWidth, 1f / (float)halfHeight)); MyRender.GetFullscreenQuad().Draw(effectSsaoBlur); MyRender.SetRenderTarget(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), null); effectSsaoBlur.SetSsaoRT(availableRenderTarget); effectSsaoBlur.SetBlurDirection(new Vector2(1f / (float)screenSizeX, 0)); MyRender.GetFullscreenQuad().Draw(effectSsaoBlur); } //Bake it into diffuse /* * MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot; * MySandboxGame.SetRenderTarget(availableRenderTarget, null); * ssEffect.SetSourceTexture(MyRender.GetRenderTarget(MyRenderTargets.Diffuse)); * ssEffect.SetScale(Vector2.One); * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default); * * MyGuiManager.GetFullscreenQuad().Draw(ssEffect); * */ MyRender.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 (!ShowOnlySSAO) { MyRender.BeginSpriteBatch(MyStateObjects.SSAO_BlendState); } else { MyRender.CurrentRenderSetup.EnableLights = false; MyRender.GraphicsDevice.Clear(ClearFlags.Target, new SharpDX.ColorBGRA(1.0f), 1, 0); MyRender.BeginSpriteBatch(MyStateObjects.SSAO_BlendState); } if (UseBlur) { MyRender.DrawSprite(MyRender.GetRenderTarget(MyRenderTargets.SSAOBlur), new Rectangle(0, 0, MyRenderCamera.Viewport.Width, MyRenderCamera.Viewport.Height), Color.White); } else { MyRender.DrawSprite(MyRender.GetRenderTarget(MyRenderTargets.SSAO), new Rectangle(0, 0, MyRenderCamera.Viewport.Width, MyRenderCamera.Viewport.Height), Color.White); } MyRender.EndSpriteBatch(); } break; } return(source); }