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();
        }
Example #2
0
        /// <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);
        }