/// <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.HDR:
                    {
                        MyMinerGame.SetRenderTarget(availableRenderTarget, null);
                        MyEffectContrast effectContrast = MyRender.GetEffect(MyEffects.Contrast) as MyEffectContrast;


                        effectContrast.SetDiffuseTexture(source);
                        effectContrast.SetHalfPixel(MyUtils.GetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height));
                        effectContrast.SetContrast(Contrast);
                        effectContrast.SetHue(Hue);
                        effectContrast.SetSaturation(Saturation);

                        MyGuiManager.GetFullscreenQuad().Draw(effectContrast);

                        return availableRenderTarget;
                    }
                    break;
            }

            return source;
        }
        public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget)
        {
            switch (postProcessStage)
            {
            case PostProcessStage.AlphaBlended:
            {
                BlendState.Opaque.Apply();
                DepthStencilState.None.Apply();
                RasterizerState.CullCounterClockwise.Apply();

                MyRender.SetRenderTarget(availableRenderTarget, null);

                MyEffectChromaticAberration effectChromaAberr = MyRender.GetEffect(MyEffects.ChromaticAberration) as MyEffectChromaticAberration;
                effectChromaAberr.SetInputTexture(source);
                effectChromaAberr.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);
                effectChromaAberr.SetAspectRatio((float)source.GetLevelDescription(0).Width / (float)source.GetLevelDescription(0).Height);
                effectChromaAberr.SetDistortionLens(DistortionLens);
                effectChromaAberr.SetDistortionCubic(DistortionCubic);
                effectChromaAberr.SetDistortionWeights(ref DistortionWeights);

                effectChromaAberr.Enable();

                MyRender.GetFullscreenQuad().Draw(effectChromaAberr);
                return(availableRenderTarget);
            }
            }
            return(source);
        }
Example #3
0
        public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget)
        {
            switch (postProcessStage)
            {
            case PostProcessStage.AlphaBlended:
            {
                //BlendState.Opaque.Apply();
                //DepthStencilState.None.Apply();
                //RasterizerState.CullCounterClockwise.Apply();

                //MyRender.SetRenderTarget(availableRenderTarget, null);

                //MyEffectVignetting effectVignetting = MyRender.GetEffect(MyEffects.Vignetting) as MyEffectVignetting;
                //effectVignetting.SetInputTexture(source);
                //effectVignetting.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);
                //effectVignetting.SetVignettingPower(VignettingPower);

                //effectVignetting.EnableVignetting();

                //MyRender.GetFullscreenQuad().Draw(effectVignetting);
                return(availableRenderTarget);
            }
            }
            return(source);
        }
        public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget)
        {
            switch (postProcessStage)
            {
                case PostProcessStage.AlphaBlended:
                {
                    //BlendState.Opaque.Apply();
                    //DepthStencilState.None.Apply();
                    //RasterizerState.CullCounterClockwise.Apply();

                    //MyRender.SetRenderTarget(availableRenderTarget, null);

                    //MyEffectVignetting effectVignetting = MyRender.GetEffect(MyEffects.Vignetting) as MyEffectVignetting;
                    //effectVignetting.SetInputTexture(source);
                    //effectVignetting.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);
                    //effectVignetting.SetVignettingPower(VignettingPower);

                    //effectVignetting.EnableVignetting();

                    //MyRender.GetFullscreenQuad().Draw(effectVignetting);
                    return availableRenderTarget;
                }
            }
            return source;
        }
        /// <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.AlphaBlended:
            {
                BlendState.Opaque.Apply();
                DepthStencilState.None.Apply();
                RasterizerState.CullCounterClockwise.Apply();

                MyRender.SetRenderTarget(availableRenderTarget, null);

                MyEffectAntiAlias effectAntiAlias = MyRender.GetEffect(MyEffects.AntiAlias) as MyEffectAntiAlias;
                effectAntiAlias.SetDiffuseTexture(source);
                effectAntiAlias.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);

                if (MyRenderConstants.RenderQualityProfile.EnableFXAA)
                {
                    effectAntiAlias.ApplyFxaa();
                }
                else
                {
                    return(source);        // Nothing to do, return source
                }
                MyRender.GetFullscreenQuad().Draw(effectAntiAlias);
                return(availableRenderTarget);
            }
            break;
            }
            return(source);
        }
        /// <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.AlphaBlended:
                    {
                        BlendState.Opaque.Apply();
                        DepthStencilState.None.Apply();
                        RasterizerState.CullCounterClockwise.Apply();

                        MyRender.SetRenderTarget(availableRenderTarget, null);

                        MyEffectAntiAlias effectAntiAlias = MyRender.GetEffect(MyEffects.AntiAlias) as MyEffectAntiAlias;
                        effectAntiAlias.SetDiffuseTexture(source);
                        effectAntiAlias.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);

                        if (MyRenderConstants.RenderQualityProfile.EnableFXAA)
                            effectAntiAlias.ApplyFxaa();
                        else
                            return source; // Nothing to do, return source

                        MyRender.GetFullscreenQuad().Draw(effectAntiAlias);
                        return availableRenderTarget;
                    }
                    break;
            }
            return source;
        }
Example #7
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.HDR:
            {
                MyMinerGame.SetRenderTarget(availableRenderTarget, null);
                MyEffectContrast effectContrast = MyRender.GetEffect(MyEffects.Contrast) as MyEffectContrast;


                effectContrast.SetDiffuseTexture(source);
                effectContrast.SetHalfPixel(MyUtils.GetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height));
                effectContrast.SetContrast(Contrast);
                effectContrast.SetHue(Hue);
                effectContrast.SetSaturation(Saturation);

                MyGuiManager.GetFullscreenQuad().Draw(effectContrast);

                return(availableRenderTarget);
            }
            break;
            }

            return(source);
        }
        public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget)
        {
            switch (postProcessStage)
            {
                case PostProcessStage.AlphaBlended:
                    {
                        BlendState.Opaque.Apply();
                        DepthStencilState.None.Apply();
                        RasterizerState.CullCounterClockwise.Apply();

                        MyRender.SetRenderTarget(availableRenderTarget, null);

                        MyEffectChromaticAberration effectChromaAberr = MyRender.GetEffect(MyEffects.ChromaticAberration) as MyEffectChromaticAberration;
                        effectChromaAberr.SetInputTexture(source);
                        effectChromaAberr.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);
                        effectChromaAberr.SetAspectRatio((float)source.GetLevelDescription(0).Width / (float)source.GetLevelDescription(0).Height);
                        effectChromaAberr.SetDistortionLens(DistortionLens);
                        effectChromaAberr.SetDistortionCubic(DistortionCubic);
                        effectChromaAberr.SetDistortionWeights(ref DistortionWeights);

                        effectChromaAberr.Enable();

                        MyRender.GetFullscreenQuad().Draw(effectChromaAberr);
                        return availableRenderTarget;
                    }
            }
            return source;
        }
Example #9
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.PostLighting:
            {
                if (MySector.FogProperties.FogMultiplier <= 0.0f)
                {
                    return(source);
                }

                //MyMinerGame.Static.GraphicsDevice.SetRenderTarget(availableRenderTarget);

                //MyMinerGame.Static.GraphicsDevice.BlendState = BlendState.NonPremultiplied;
                MyStateObjects.VolumetricFogBlend.Apply();

                //    MyMinerGame.Static.GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;

                MyEffectVolumetricFog volumetricFog = MyRender.GetEffect(MyEffects.VolumetricFog) as MyEffectVolumetricFog;

                int width  = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Width;
                int height = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Height;

                volumetricFog.SetSourceRT(source);
                volumetricFog.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                volumetricFog.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals));
                volumetricFog.SetHalfPixel(width, height);
                volumetricFog.SetViewProjectionMatrix(MyCamera.ViewProjectionMatrix);
                volumetricFog.SetCameraPosition(MyCamera.Position);
                volumetricFog.SetCameraMatrix(Matrix.Invert(MyCamera.ViewMatrix));
                volumetricFog.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                MyCamera.SetupBaseEffect(volumetricFog);

                //volumetricFog.SetWorldMatrix(Matrix.CreateScale(1000) * Matrix.CreateTranslation(MyCamera.Position));
                if (MyFakes.MWBUILDER)
                {
                    volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.SkipBackground);
                }
                else
                {
                    volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.Default);
                }

                MyGuiManager.GetFullscreenQuad().Draw(volumetricFog);

                //  MyMinerGame.Static.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
                //  MyMinerGame.Static.GraphicsDevice.BlendState = BlendState.AlphaBlend;
            }
            break;
            }
            return(source);
        }
        /// <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.PostLighting:
                    {
                        if (MySector.FogProperties.FogMultiplier <= 0.0f)
                            return source;

                        //MyMinerGame.Static.GraphicsDevice.SetRenderTarget(availableRenderTarget);

                        //MyMinerGame.Static.GraphicsDevice.BlendState = BlendState.NonPremultiplied;
                        MyStateObjects.VolumetricFogBlend.Apply();

                    //    MyMinerGame.Static.GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;

                        MyEffectVolumetricFog volumetricFog = MyRender.GetEffect(MyEffects.VolumetricFog) as MyEffectVolumetricFog;

                        int width = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Width;
                        int height = MyRender.GetRenderTarget(MyRenderTargets.Normals).GetLevelDescription(0).Height;

                        volumetricFog.SetSourceRT(source);
                        volumetricFog.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                        volumetricFog.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals));
                        volumetricFog.SetHalfPixel(width, height);
                        volumetricFog.SetViewProjectionMatrix(MyCamera.ViewProjectionMatrix);
                        volumetricFog.SetCameraPosition(MyCamera.Position);
                        volumetricFog.SetCameraMatrix(Matrix.Invert(MyCamera.ViewMatrix));
                        volumetricFog.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                        MyCamera.SetupBaseEffect(volumetricFog);

                        //volumetricFog.SetWorldMatrix(Matrix.CreateScale(1000) * Matrix.CreateTranslation(MyCamera.Position));
                        if (MyFakes.MWBUILDER)
                            volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.SkipBackground);
                        else
                            volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.Default);

                        MyGuiManager.GetFullscreenQuad().Draw(volumetricFog);

                      //  MyMinerGame.Static.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
                      //  MyMinerGame.Static.GraphicsDevice.BlendState = BlendState.AlphaBlend;
                    }
                    break;
            }        
            return source;
        }
        /// <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.PostLighting:
                    {
                        //todo fog
                        //if (MySector.FogProperties.FogMultiplier <= 0.0f)
                          //  return source;

                        MyStateObjects.VolumetricFogBlend.Apply();

                        MyEffectVolumetricFog volumetricFog = MyRender.GetEffect(MyEffects.VolumetricFog) as MyEffectVolumetricFog;

                        int width = MyRenderCamera.Viewport.Width;
                        int height = MyRenderCamera.Viewport.Height;

                        var scale = MyRender.GetScaleForViewport(source);

                        volumetricFog.SetSourceRT(source);
                        volumetricFog.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                        volumetricFog.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals));
                        volumetricFog.SetHalfPixel(width, height);
                        volumetricFog.SetViewProjectionMatrix((Matrix)MyRenderCamera.ViewProjectionMatrix);
                        volumetricFog.SetCameraPosition((Vector3)MyRenderCamera.Position);
                        volumetricFog.SetCameraMatrix((Matrix)MatrixD.Invert(MyRenderCamera.ViewMatrix));
                        volumetricFog.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                        volumetricFog.SetScale(scale);
                        MyRenderCamera.SetupBaseEffect(volumetricFog, MyLodTypeEnum.LOD0);

                        //volumetricFog.SetWorldMatrix(Matrix.CreateScale(1000) * Matrix.CreateTranslation(MyCamera.Position));
                        //todo
                        //if (MyFakes.MWBUILDER)
                        //    volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.SkipBackground);
                        //else
                            volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.Default);

                        MyRender.GetFullscreenQuad().Draw(volumetricFog);
                    }
                    break;
            }        
            return source;
        }
Example #12
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.PostLighting:
            {
                //todo fog
                //if (MySector.FogProperties.FogMultiplier <= 0.0f)
                //  return source;

                MyStateObjects.VolumetricFogBlend.Apply();

                MyEffectVolumetricFog volumetricFog = MyRender.GetEffect(MyEffects.VolumetricFog) as MyEffectVolumetricFog;

                int width  = MyRenderCamera.Viewport.Width;
                int height = MyRenderCamera.Viewport.Height;

                var scale = MyRender.GetScaleForViewport(source);

                volumetricFog.SetSourceRT(source);
                volumetricFog.SetDepthsRT(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                volumetricFog.SetNormalsTexture(MyRender.GetRenderTarget(MyRenderTargets.Normals));
                volumetricFog.SetHalfPixel(width, height);
                volumetricFog.SetViewProjectionMatrix((Matrix)MyRenderCamera.ViewProjectionMatrix);
                volumetricFog.SetCameraPosition((Vector3)MyRenderCamera.Position);
                volumetricFog.SetCameraMatrix((Matrix)MatrixD.Invert(MyRenderCamera.ViewMatrix));
                volumetricFog.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                volumetricFog.SetScale(scale);
                MyRenderCamera.SetupBaseEffect(volumetricFog, MyLodTypeEnum.LOD0);

                //volumetricFog.SetWorldMatrix(Matrix.CreateScale(1000) * Matrix.CreateTranslation(MyCamera.Position));
                //todo
                //if (MyFakes.MWBUILDER)
                //    volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.SkipBackground);
                //else
                volumetricFog.SetTechnique(MyEffectVolumetricFog.TechniqueEnum.Default);

                MyRender.GetFullscreenQuad().Draw(volumetricFog);
            }
            break;
            }
            return(source);
        }
        public override Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget)
        {
            switch (postProcessStage)
            {
            case PostProcessStage.AlphaBlended:
            {
                BlendState.Opaque.Apply();
                DepthStencilState.None.Apply();
                RasterizerState.CullCounterClockwise.Apply();

                MyRender.SetRenderTarget(availableRenderTarget, null);

                MyEffectColorMapping effect = MyRender.GetEffect(MyEffects.ColorMapping) as MyEffectColorMapping;
                effect.SetInputTexture(source);
                effect.SetHalfPixel(source.GetLevelDescription(0).Width, source.GetLevelDescription(0).Height);
                effect.Enable();

                MyRender.GetFullscreenQuad().Draw(effect);
                return(availableRenderTarget);
            }
            }
            return(source);
        }
        /// <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.AlphaBlended:
            {
                var halfRT = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf0);

                MyRender.SetRenderTarget(halfRT, null);
                BlendState.Opaque.Apply();
                RasterizerState.CullNone.Apply();
                DepthStencilState.None.Apply();

                MyEffectGodRays effectGodRays = MyRender.GetEffect(MyEffects.GodRays) as MyEffectGodRays;

                effectGodRays.SetDiffuseTexture(source);
                effectGodRays.SetDepthTexture(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                effectGodRays.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                effectGodRays.SetView((Matrix)MyRenderCamera.ViewMatrix);
                effectGodRays.SetWorldViewProjection((Matrix)MyRenderCamera.ViewProjectionMatrix);
                effectGodRays.SetDensity(Density);
                effectGodRays.SetDecay(Decay);

                effectGodRays.SetWeight(Weight * (1 - MyRender.FogProperties.FogMultiplier));
                effectGodRays.SetExposition(Exposition);
                effectGodRays.SetLightPosition(15000f * -MyRender.Sun.Direction);
                effectGodRays.SetLightDirection(MyRender.Sun.Direction);
                effectGodRays.SetCameraPos((Vector3)MyRenderCamera.Position);

                MyRender.GetFullscreenQuad().Draw(effectGodRays);

                if (ApplyBlur)
                {
                    var auxTarget = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102);

                    var blurEffect = MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur;
                    blurEffect.SetHalfPixel(halfRT.GetLevelDescription(0).Width, halfRT.GetLevelDescription(0).Height);

                    // Apply vertical gaussian blur
                    MyRender.SetRenderTarget(auxTarget, null);
                    blurEffect.BlurAmount = 1;
                    blurEffect.SetSourceTexture(halfRT);
                    blurEffect.SetHeightForVerticalPass(halfRT.GetLevelDescription(0).Height);
                    MyRender.GetFullscreenQuad().Draw(blurEffect);

                    // Apply horizontal gaussian blur
                    MyRender.SetRenderTarget(halfRT, null);
                    blurEffect.BlurAmount = 1;
                    blurEffect.SetSourceTexture(auxTarget);
                    blurEffect.SetWidthForHorisontalPass(auxTarget.GetLevelDescription(0).Width);
                    MyRender.GetFullscreenQuad().Draw(blurEffect);
                }

                // Additive
                MyRender.SetRenderTarget(availableRenderTarget, null);
                //MySandboxGame.Static.GraphicsDevice.Clear(ClearFlags.All, new SharpDX.ColorBGRA(0), 1, 0);
                BlendState.Opaque.Apply();
                MyRender.Blit(source, true);

                var upscaleEffect = MyRender.GetEffect(MyEffects.Scale) as MyEffectScale;
                upscaleEffect.SetScale(new Vector2(2));
                upscaleEffect.SetTechnique(MyEffectScale.Technique.HWScale);
                MyStateObjects.Additive_NoAlphaWrite_BlendState.Apply();

                upscaleEffect.SetSourceTextureMod(halfRT);
                MyRender.GetFullscreenQuad().Draw(upscaleEffect);

                return(availableRenderTarget);
            }
            }

            return(source);
        }
Example #15
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 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);
        }
Example #16
0
 private void PostProcessPass(ITexture colorTexture, ITexture depthTexture, ref Point actualScreenRezolution)
 {
     PostProcessStage.ExecutePostProcessPass(colorTexture, depthTexture, ref actualScreenRezolution);
 }
 /// <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>
 /// <param name="source">Render target where is current scene.</param>
 /// <param name="availableRenderTarget">Render target for use in shader, can be used as output or not.</param>
 /// <returns>Returns render target with output, must be source or availableRenderTarget</returns>
 public abstract Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget);
Example #18
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>
 /// <param name="source">Render target where is current scene.</param>
 /// <param name="availableRenderTarget">Render target for use in shader, can be used as output or not.</param>
 /// <returns>Returns render target with output, must be source or availableRenderTarget</returns>
 public abstract Texture Render(PostProcessStage postProcessStage, Texture source, Texture availableRenderTarget);
Example #19
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:
                    {
                        //if (RenderHDRThisFrame())
                        //{
                        //    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).CopyEmissivityTechnique = MyEffectBlendLights.Technique.CopyEmissivityHDR;
                        //    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).DefaultTechnique = MyEffectBlendLights.Technique.HDR;
                        //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultTechnique = MyEffectDirectionalLight.Technique.DefaultHDR;
                        //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultWithoutShadowsTechnique = MyEffectDirectionalLight.Technique.WithoutShadowsHDR;
                        //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultNoLightingTechnique = MyEffectDirectionalLight.Technique.NoLightingHDR;

                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultReflectorTechnique = MyEffectPointLight.MyEffectPointLightTechnique.ReflectorHDR; // unused, dont have instancing
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotShadowTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotShadowsHDR;

                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.PointHDR_Instanced;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.HemisphereHDR_Instanced;
                        //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR_Instanced;
                        //}
                        break;
                    }
                case PostProcessStage.HDR:
                    {
                        // if HDR is disabled or some debug rendering display
                        // is enabled then skip HDR post process
                        if (!RenderHDRThisFrame())
                            return source;

                        BlendState.Opaque.Apply();
                        DepthStencilState.None.Apply();
                       // RasterizerState.CullNone.Apply(MyMinerGameDX.Static.GraphicsDevice);

                        m_thresholdTargets[0] = MyRender.GetRenderTarget(MyRenderTargets.Normals);
                        m_thresholdTargets[1] = availableRenderTarget;

                        // 1. threshold
                        GenerateThreshold(
                            source,
                            MyRender.GetRenderTarget(MyRenderTargets.Diffuse),
                            m_thresholdTargets,
                            MyRender.GetEffect(MyEffects.Threshold) as MyEffectThreshold,
                            Threshold, BloomIntensity, BloomIntensityBackground, Exposure);

                                   /*
                        MyMinerGame.SetRenderTarget(null, null,  SetDepthTargetEnum.RestoreDefault);
                        MyMinerGame.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault);
                        MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot;
                        ssEffect.SetSourceTexture(m_thresholdTargets[0]);
                        ssEffect.SetScale(MinerWarsMath.Vector2.One);
                        ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default);
                        MyGuiManager.GetFullscreenQuad().Draw(ssEffect);
                        return availableRenderTarget;
                                            */
                                    

                        // 2. downscale HDR1 -> Downscaled8
                        // !! IMPORTANT !! you cannot just switch the function call if you want different downscale
                        // Also changing the RTs is necessary (they have fixed dimensions).
                        GenerateDownscale4(
                            MyRender.GetRenderTarget(MyRenderTargets.Normals),
                            MyRender.GetRenderTarget(MyRenderTargets.Depth),
                            MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                            MyRender.GetEffect(MyEffects.Scale) as MyEffectScale);

                        /*
                        // 3?. avg luminance
                        float dt = (MyMinerGame.TotalGamePlayTimeInMilliseconds - lastTime) / 1000.0f;
                        lastTime = MyMinerGame.TotalGamePlayTimeInMilliseconds;
                        CalculateAverageLuminance(
                            MyRender.GetRenderTarget(MyRenderTargets.Downscaled8),
                            MyRender.GetRenderTarget(MyRenderTargets.Downscaled8Threshold),
                            MyRender.GetEffect(MyEffects.Luminance) as MyEffectLuminance,
                            MyRender.GetEffect(MyEffects.Scale) as MyEffectScale,
                            dt, 0.5f);
                        */

                        // 4. blur
                        Blur(MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                            MyRender.GetRenderTarget(MyRenderTargets.HDR4),
                            MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur,
                            VerticalBlurAmount, HorizontalBlurAmount);

                        // 5. scale blurred to halfsize
                        Upscale4To2(
                            MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                            MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102),
                            MyRender.GetEffect(MyEffects.Scale) as MyEffectScale);

                        MyMinerGame.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault);

                        // 6. tonemap + apply bloom
                        HDR(
                            source,
                            MyRender.GetRenderTarget(MyRenderTargets.Diffuse),
                            MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102),
                            MyRender.GetEffect(MyEffects.HDR) as MyEffectHDR,
                            0.6f, Exposure);

                        return availableRenderTarget;

                        //RenderTarget2D temp = currentFrameAdaptedLuminance;
                        //currentFrameAdaptedLuminance = lastFrameAdaptedLuminance;
                        //lastFrameAdaptedLuminance = temp;
                    }
            }
            return source;
        }
Example #20
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:
            {
                //if (RenderHDRThisFrame())
                //{
                //    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).CopyEmissivityTechnique = MyEffectBlendLights.Technique.CopyEmissivityHDR;
                //    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).DefaultTechnique = MyEffectBlendLights.Technique.HDR;
                //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultTechnique = MyEffectDirectionalLight.Technique.DefaultHDR;
                //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultWithoutShadowsTechnique = MyEffectDirectionalLight.Technique.WithoutShadowsHDR;
                //    (MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight).DefaultNoLightingTechnique = MyEffectDirectionalLight.Technique.NoLightingHDR;

                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereTechnique = MyEffectPointLight.MyEffectPointLightTechnique.DefaultHDR;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultReflectorTechnique = MyEffectPointLight.MyEffectPointLightTechnique.ReflectorHDR; // unused, dont have instancing
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotShadowTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotShadowsHDR;

                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultPointInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.PointHDR_Instanced;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultHemisphereInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.HemisphereHDR_Instanced;
                //    (MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight).DefaultSpotInstancedTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotHDR_Instanced;
                //}
                break;
            }

            case PostProcessStage.HDR:
            {
                // if HDR is disabled or some debug rendering display
                // is enabled then skip HDR post process
                if (!RenderHDRThisFrame())
                {
                    return(source);
                }

                BlendState.Opaque.Apply();
                DepthStencilState.None.Apply();
                // RasterizerState.CullNone.Apply(MySandboxGameDX.Static.GraphicsDevice);

                m_thresholdTargets[0] = MyRender.GetRenderTarget(MyRenderTargets.HDRAux);
                m_thresholdTargets[1] = availableRenderTarget;

                // 1. threshold
                GenerateThreshold(
                    source,
                    MyRender.GetRenderTarget(MyRenderTargets.Diffuse),
                    m_thresholdTargets,
                    MyRender.GetEffect(MyEffects.Threshold) as MyEffectThreshold,
                    Threshold, BloomIntensity, BloomIntensityBackground, Exposure);

                /*
                 * MySandboxGame.SetRenderTarget(null, null,  SetDepthTargetEnum.RestoreDefault);
                 * MySandboxGame.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault);
                 * MyEffectScreenshot ssEffect = MyRender.GetEffect(MyEffects.Screenshot) as MyEffectScreenshot;
                 * ssEffect.SetSourceTexture(m_thresholdTargets[0]);
                 * ssEffect.SetScale(VRageMath.Vector2.One);
                 * ssEffect.SetTechnique(MyEffectScreenshot.ScreenshotTechniqueEnum.Default);
                 * MyGuiManager.GetFullscreenQuad().Draw(ssEffect);
                 * return availableRenderTarget;
                 */


                // 2. downscale HDR1 -> Downscaled8
                // !! IMPORTANT !! you cannot just switch the function call if you want different downscale
                // Also changing the RTs is necessary (they have fixed dimensions).
                GenerateDownscale4(
                    MyRender.GetRenderTarget(MyRenderTargets.HDRAux),         // Requires mip mapped RT with mip autogeneration
                    MyRender.GetRenderTarget(MyRenderTargets.Depth),
                    MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                    MyRender.GetEffect(MyEffects.Scale) as MyEffectScale);

                /*
                 * // 3?. avg luminance
                 * float dt = (MySandboxGame.TotalGamePlayTimeInMilliseconds - lastTime) / 1000.0f;
                 * lastTime = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                 * CalculateAverageLuminance(
                 *  MyRender.GetRenderTarget(MyRenderTargets.Downscaled8),
                 *  MyRender.GetRenderTarget(MyRenderTargets.Downscaled8Threshold),
                 *  MyRender.GetEffect(MyEffects.Luminance) as MyEffectLuminance,
                 *  MyRender.GetEffect(MyEffects.Scale) as MyEffectScale,
                 *  dt, 0.5f);
                 */

                // 4. blur
                Blur(MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                     MyRender.GetRenderTarget(MyRenderTargets.HDR4),
                     MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur,
                     VerticalBlurAmount, HorizontalBlurAmount);

                // 5. scale blurred to halfsize
                Upscale4To2(
                    MyRender.GetRenderTarget(MyRenderTargets.HDR4Threshold),
                    MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102),
                    MyRender.GetEffect(MyEffects.Scale) as MyEffectScale);

                MyRender.SetRenderTarget(availableRenderTarget, null, SetDepthTargetEnum.RestoreDefault);

                // 6. tonemap + apply bloom
                HDR(
                    source,
                    MyRender.GetRenderTarget(MyRenderTargets.Diffuse),
                    MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102),
                    MyRender.GetEffect(MyEffects.HDR) as MyEffectHDR,
                    0.6f, Exposure);

                return(availableRenderTarget);

                //RenderTarget2D temp = currentFrameAdaptedLuminance;
                //currentFrameAdaptedLuminance = lastFrameAdaptedLuminance;
                //lastFrameAdaptedLuminance = temp;
            }
            }
            return(source);
        }
Example #21
0
        internal static void RenderPostProcesses(PostProcessStage postProcessStage, Texture source, Texture[] target, Texture availableRT, bool copyToTarget = true, bool scaleToTarget = false)
        {
            Texture lastSurface = source;

            GetRenderProfiler().StartProfilingBlock("Render Post process: " + postProcessStage.ToString());

            {
                if (Settings.EnableLightsRuntime)
                {
                    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).DefaultTechnique = MyEffectBlendLights.Technique.LightsEnabled;
                    (MyRender.GetEffect(MyEffects.BlendLights) as MyEffectBlendLights).CopyEmissivityTechnique = MyEffectBlendLights.Technique.CopyEmissivity;


                    MyEffectDirectionalLight directionalLight = MyRender.GetEffect(MyEffects.DirectionalLight) as MyEffectDirectionalLight;
                    directionalLight.DefaultTechnique = MyEffectDirectionalLight.Technique.Default;
                    directionalLight.DefaultWithoutShadowsTechnique = MyEffectDirectionalLight.Technique.WithoutShadows;
                    directionalLight.DefaultNoLightingTechnique = MyEffectDirectionalLight.Technique.NoLighting;

                    MyEffectPointLight pointLight = MyRender.GetEffect(MyEffects.PointLight) as MyEffectPointLight;
                    pointLight.PointTechnique = MyEffectPointLight.MyEffectPointLightTechnique.Point;
                    pointLight.PointWithShadowsTechnique = MyEffectPointLight.MyEffectPointLightTechnique.PointShadows;
                    pointLight.HemisphereTechnique = MyEffectPointLight.MyEffectPointLightTechnique.Point;
                    pointLight.SpotTechnique = MyEffectPointLight.MyEffectPointLightTechnique.Spot;
                    pointLight.SpotShadowTechnique = MyEffectPointLight.MyEffectPointLightTechnique.SpotShadows;
                }
            }


            foreach (MyPostProcessBase postProcess in m_postProcesses)
            {
                if (postProcess.Enabled && (MyRender.CurrentRenderSetup.EnabledPostprocesses == null || MyRender.CurrentRenderSetup.EnabledPostprocesses.Contains(postProcess.Name)))
                {
                    var currSurface = postProcess.Render(postProcessStage, lastSurface, availableRT);

                    // Effect used availableRT as target, so lastSurface is available now
                    if (currSurface != lastSurface && lastSurface != null)
                    {
                        availableRT = lastSurface;
                    }
                    lastSurface = currSurface;
                }
            }

            GetRenderProfiler().EndProfilingBlock();

            if (lastSurface != null && copyToTarget)
            {
                MyRender.SetRenderTargets(target, null);

                if (scaleToTarget)
                    SetCorrectViewportSize();

                BlendState.Opaque.Apply();

                Blit(lastSurface, scaleToTarget);
            }
        }
        /// <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;
        }
        /// <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.AlphaBlended:
                    {
                                  
                        var halfRT = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf0);

                        MyRender.SetRenderTarget(halfRT, null);
                        BlendState.Opaque.Apply();
                        RasterizerState.CullNone.Apply();
                        DepthStencilState.None.Apply();
                        
                        MyEffectGodRays effectGodRays = MyRender.GetEffect(MyEffects.GodRays) as MyEffectGodRays;

                        effectGodRays.SetDiffuseTexture(source);
                        effectGodRays.SetDepthTexture(MyRender.GetRenderTarget(MyRenderTargets.Depth));
                        effectGodRays.SetFrustumCorners(MyRender.GetShadowRenderer().GetFrustumCorners());
                        effectGodRays.SetView((Matrix)MyRenderCamera.ViewMatrix);
                        effectGodRays.SetWorldViewProjection((Matrix)MyRenderCamera.ViewProjectionMatrix);
                        effectGodRays.SetDensity(Density);
                        effectGodRays.SetDecay(Decay);
                        
                        effectGodRays.SetWeight(Weight * (1 - MyRender.FogProperties.FogMultiplier));
                        effectGodRays.SetExposition(Exposition);
                        effectGodRays.SetLightPosition(15000f * -MyRender.Sun.Direction);
                        effectGodRays.SetLightDirection(MyRender.Sun.Direction);
                        effectGodRays.SetCameraPos((Vector3)MyRenderCamera.Position);

                        MyRender.GetFullscreenQuad().Draw(effectGodRays);
                        
                        if (ApplyBlur)
                        {
                            var auxTarget = MyRender.GetRenderTarget(MyRenderTargets.AuxiliaryHalf1010102);

                            var blurEffect = MyRender.GetEffect(MyEffects.GaussianBlur) as MyEffectGaussianBlur;
                            blurEffect.SetHalfPixel(halfRT.GetLevelDescription(0).Width, halfRT.GetLevelDescription(0).Height);

                            // Apply vertical gaussian blur
                            MyRender.SetRenderTarget(auxTarget, null);
                            blurEffect.BlurAmount = 1;
                            blurEffect.SetSourceTexture(halfRT);
                            blurEffect.SetHeightForVerticalPass(halfRT.GetLevelDescription(0).Height);
                            MyRender.GetFullscreenQuad().Draw(blurEffect);

                            // Apply horizontal gaussian blur
                            MyRender.SetRenderTarget(halfRT, null);
                            blurEffect.BlurAmount = 1;
                            blurEffect.SetSourceTexture(auxTarget);
                            blurEffect.SetWidthForHorisontalPass(auxTarget.GetLevelDescription(0).Width);
                            MyRender.GetFullscreenQuad().Draw(blurEffect);
                        }
                                
                        // Additive
                        MyRender.SetRenderTarget(availableRenderTarget, null);
                        //MySandboxGame.Static.GraphicsDevice.Clear(ClearFlags.All, new SharpDX.ColorBGRA(0), 1, 0);
                        BlendState.Opaque.Apply();
                        MyRender.Blit(source, true);

                        var upscaleEffect = MyRender.GetEffect(MyEffects.Scale) as MyEffectScale;
                        upscaleEffect.SetScale(new Vector2(2));
                        upscaleEffect.SetTechnique(MyEffectScale.Technique.HWScale);
                        MyStateObjects.Additive_NoAlphaWrite_BlendState.Apply();

                        upscaleEffect.SetSourceTextureMod(halfRT);
                        MyRender.GetFullscreenQuad().Draw(upscaleEffect);
                                     
                        return availableRenderTarget;
                    }
            }

            return source;
        }