//private void GetFilterOffsets(int size)
        //{
        //    //float fTexelSize = 3.0f / (2.0f * (float)size);
        //    float fTexelSize = 1.0f / (float)size;
        //    // Generate the tecture co-ordinates for the specified depth-map size
        //    // 4 3 5
        //    // 1 0 2
        //    // 7 6 8
        //    offsets[0] = new Vector2(0, 0);
        //    offsets[1] = new Vector2(-fTexelSize, 0.0f);
        //    offsets[2] = new Vector2(fTexelSize, 0.0f);
        //    offsets[3] = new Vector2(0.0f, -fTexelSize);
        //    offsets[6] = new Vector2(0.0f, fTexelSize);
        //    offsets[4] = new Vector2(-fTexelSize, -fTexelSize);
        //    offsets[5] = new Vector2(fTexelSize, -fTexelSize);
        //    offsets[7] = new Vector2(-fTexelSize, fTexelSize);
        //    offsets[8] = new Vector2(fTexelSize, fTexelSize);
        //}

        /// <summary>
        /// Draw the scene`s dephts from the camera to the DephtTexture
        /// </summary>
        /// <param name="data">Scene , the current Scene</param>
        public override void Apply()
        {
            if (EngineState.Shadow.Enable && (isDynamic || Rendered))
            {
                var   device = GraphicDeviceFactory.Device;
                Scene scene  = Engine.Scene;
                var   oldvp  = device.ViewPort;

                device.ViewPort = _vp;
                device.SaveRenderTarget();

                ShadowMap.SetTarget(device);
                device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color4.White, 1, 0);

                var oldCamera = scene.ActiveCamera;
                device.Rasterizer = _rasterizer;
                device.Blend      = _blendState;
                device.DepthTest  = _detpthStencil;

                scene.ActiveCamera = camera;
                RenderManager.ApplyTechnique <DepthSceneRender>();

                scene.ActiveCamera = oldCamera;

                device.RestoreRenderTarget();

                device.ViewPort = oldvp;
                Rendered        = true;
            }
        }
Example #2
0
        private void MensureLuminance(GraphicDevice device, IShaderStage stage)
        {
            effect.Technique = HdrEffect.SampleAvgLum;

            RenderTexture2D dest   = _rtToneMap[Tonemaptextures - 1];
            RenderTexture2D source = _rtHdrScene;

            dest.SetTarget(device);
            source.SetTexture(0, device);

            stage.SetSampler(0, _linearSampler);

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);

            effect.Technique = HdrEffect.ResampleAvgLum;
            stage.SetSampler(0, _pointSampler);

            for (int i = Tonemaptextures - 2; i > 0; i--)
            {
                dest   = _rtToneMap[i];
                source = _rtToneMap[i + 1];

                dest.SetTarget(device);
                source.SetTexture(0, device);
                device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
                _quadRender.DrawQuad(effect);
            }

            effect.Technique = HdrEffect.ResampleAvgLumExp;
            source           = _rtToneMap[1];
            dest             = _rtToneMap[0];

            dest.SetTarget(device);
            source.SetTexture(0, device);

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);
        }
Example #3
0
            public override void Apply()
            {
                var graphic = GraphicDeviceFactory.Device;

                graphic.SaveRenderTarget();
                var oldvp = graphic.ViewPort;

                graphic.ViewPort = _vp;

                _shadowRt.SetTarget(graphic);
                graphic.Clear(Graphics.ClearFlags.Target | Graphics.ClearFlags.ZBuffer, new Color4(0, 0, 0, 0), 1, 0);
                base.Apply();

                graphic.SetRenderTarget(null);
                graphic.ViewPort = oldvp;
            }
        public bool IsTransparent(Texture2D texture)
        {
            var device = GraphicDeviceFactory.Device;

            var oldvp = device.ViewPort;

            device.ViewPort = new ViewPort(0, 0, 1, 1);

            device.SaveRenderTarget();
            _renderTexture.SetTarget();

            device.PS.SetResource(0, texture);
            device.PS.SetSampler(0, _samState);

            _sprite.Begin();

            var deviceBlend = device.Blend;

            device.Blend = blend;
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, new Color4(0, 0, 0, 0), 1, 0);

            _sprite.SetFullScreenTransform(_effect);
            _sprite.DrawQuad(_effect);

            _sprite.End();

            device.RestoreRenderTarget();
            device.ViewPort = oldvp;
            device.Blend    = deviceBlend;

            byte alpha = 0;
            var  rec   = _renderTexture.Texture.Map(0, MapType.Read);

            unsafe
            {
                alpha = *(byte *)rec.DataPointer;
            }
            _renderTexture.Texture.UnMap(0);

            return(alpha > 0);
        }
Example #5
0
 private void DownSample(GraphicDevice graphic, RenderTexture2D src, RenderTexture2D dest)
 {
     dest.SetTarget(graphic);
     src.SetTexture(0, graphic);
     _sprite.DrawQuad(_effect);
 }
Example #6
0
        public override unsafe void Apply()
        {
            #region Render

            var graphics = GraphicDeviceFactory.Device;
            var lighting = EngineState.Lighting;

            var oldvp = graphics.ViewPort;
            graphics.ViewPort = _vp;

            graphics.RasterizerStack.Push(_rast);
            graphics.BlendStack.Push(_blend);
            graphics.DepthStencilStack.Push(_depth);

            graphics.SaveRenderTarget();

            _rtx.SetTarget(graphics);

            var transp = lighting.TransparencyEnable;
            lighting.TransparencyEnable = false;

            graphics.Clear(ClearFlags.Target | ClearFlags.ZBuffer, new Color4(0, 0, 0, 0), 1, 0);

            hitTestRender.RenderObjects();

            graphics.RestoreRenderTarget();

            graphics.RasterizerStack.Pop();
            graphics.BlendStack.Pop();
            graphics.DepthStencilStack.Pop();


            graphics.ViewPort           = oldvp;
            lighting.TransparencyEnable = transp;

            #endregion


            #region Test Surface

            try
            {
                var stream = _rtx.Texture.Map(0, MapType.Read);

                if (Mode == HitTestMode.Single)
                {
                    var point = HitTestLocation;
                    int x     = (int)point.X;
                    int y     = (int)point.Y;

                    int           offset = y * stream.RowPitch + x * sizeof(int);
                    var           abgr   = *(int *)(stream.DataPointer + offset);
                    HitTestResult result;
                    hitTestRender.FindResult(abgr, out result); // AddSelection(id - 1);

                    //var pter = (byte*)stream.DataPointer;
                    // for (int i = 0; i <  _rtx.Height; i++)
                    // {
                    //     for (int j = 0;  j < _rtx.Width; j++)
                    //     {
                    //         id = ((int*)pter)[j];
                    //         if (id >0)
                    //             AddSelection(id, visibleComponents, drawables);
                    //     }

                    //     pter += stream.RowPitch;
                    // }
                }
                else
                {
                    var rec    = this.HitTestRegion;
                    int offset = rec.Y * stream.RowPitch + rec.X * sizeof(int);

                    byte *pter = (byte *)stream.DataPointer + offset;

                    for (int i = 0; i < rec.Height && i < _rtx.Height; ++i)
                    {
                        for (int j = 0; j < rec.Width && j < _rtx.Width; ++j)
                        {
                            var           abgr = ((int *)pter)[j];
                            HitTestResult result;
                            hitTestRender.FindResult(abgr, out result);
                        }

                        pter += stream.RowPitch;
                    }
                }
            }

            finally
            {
                _rtx.Texture.UnMap(0);
            }

            #endregion
        }
Example #7
0
        public override void Apply()
        {
            if (EngineState.Lighting.Reflection.Enable)
            {
                var graphic = GraphicDeviceFactory.Device;
                graphic.SaveRenderTarget();

                var tech = Service.Require <ClipPlaneSceneTechnique>();

                #region RenderReflection

                if (_useReflection)
                {
                    if (_rasterizer == null)
                    {
                        _rasterizer = graphic.CreateRasterizerState(new RasterizerDesc(true)
                        {
                            Cull = CullMode.Front
                        });
                    }
                    graphic.RasterizerStack.Push(_rasterizer);

                    //var oldcamera = Engine.Scene.ActiveCamera;

                    //camera.Projection = oldcamera.Projection;
                    //var front = Vector3.TransformNormal(oldcamera.Front, _reflTransform);
                    //var right = Vector3.Normalize(Vector3.Cross(Vector3.UnitY, front));
                    //var up = Vector3.Normalize(Vector3.Cross(front, right));

                    //camera.Position = Vector3.TransformCoordinates(oldcamera.Position, _reflTransform);
                    //camera.Right = right;
                    //camera.Up = up;
                    //camera.Front = front;
                    //camera.CommitChanges();
                    //Engine.Scene.ActiveCamera = camera;

                    _rtReflection.SetTarget(graphic);
                    graphic.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color4.Black, 1, 0);

                    tech.ReflectionMatrix = _reflTransform;
                    tech.Plane            = _plane;

                    RenderManager.ApplyTechnique(tech);

                    tech.ReflectionMatrix = Matrix.Identity;
                    tech.Plane            = new Plane();

                    graphic.RasterizerStack.Pop();
                    //Engine.Scene.ActiveCamera = oldcamera;
                }

                #endregion

                #region RenderRefraction
                if (_useRefraction)
                {
                    _rtRefraction.SetTarget(graphic);
                    GraphicDeviceFactory.Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, 0, 1, 0);

                    tech.ReflectionMatrix = Matrix.Identity;
                    RenderManager.ApplyTechnique(tech);
                }
                #endregion

                graphic.RestoreRenderTarget();
            }
        }
Example #8
0
        private unsafe void RenderStar(GraphicDevice device)
        {
            RenderTexture2D source;
            RenderTexture2D dest;

            var glare = _state.Glare;

            //renderMgr.Fill(rtStarFinal, 0);
            // Avoid rendering the star if it's not being used in the current glare
            if (glare == null || glare.glareLuminance <= 0.0f || glare.starLuminance <= 0.0f)
            {
                _rtStarFinal.SetTarget(device);
                device.Clear(ClearFlags.Target, Color4.Black, 1, 0);

                return;
            }

            fixed(Vector4 *_ptSampleOffsets = _sampleOffsetsStar)
            {
                Vector2 *ptSampleOffsets = (Vector2 *)_ptSampleOffsets;

                fixed(Vector4 *ptSampleWeights = _sampleWeightsStar)
                {
                    //#region StarSourceToBloomSource (DownSampler2x2)

                    //effect.Technique = HDREffect.DownSampler2x2;
                    //dest = rtBrightPassFilter;
                    //source = rtStartSource;

                    //dest.SetTarget(device);
                    //source.SetTexture(0, device);
                    //device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
                    //quadRender.DrawQuad(effect);
                    //#endregion

                    #region BrighPassToStarSource

                    effect.Technique = HdrEffect.GaussBlur5X5;
                    source           = _rtBrightPassFilter;
                    dest             = _rtStartSource;

                    dest.SetTarget(device);
                    source.SetTexture(0, device);

                    FillSampleOffsets_GaussBlur5x5(source.Width, source.Height, ptSampleOffsets, ptSampleWeights, 1);

                    _map.SampleOffsets = _sampleOffsetsStar;
                    _map.SampleWeights = _sampleWeightsStar;

                    _quadRender.DrawQuad(effect);

                    #endregion

                    //float fTanFoV = (float)Math.Atan(Numerics.PI / 8.0f);
                    const float    fTanFoV   = 0.37419668052268495F;
                    const int      maxPasses = 3;
                    const int      samples   = 8;
                    int            i; // Loop variables
                    StarDefinition starDef = glare.StarDef;

                    device.PS.SetSampler(0, _linearSampler);

                    float srcW = _rtStartSource.Width;
                    float srcH = _rtStartSource.Height;


                    for (int p = 0; p < maxPasses; p++)
                    {
                        float ratio = (float)(p + 1) / (float)maxPasses;
                        for (int s = 0; s < samples; s++)
                        {
                            Vector4 chromaticAberrColor = Numerics.Lerp(StarDefinition.ChromaticAberrationColor[s], _sColorWhite, ratio);
                            _sAaColor[p, s] = Numerics.Lerp(_sColorWhite, chromaticAberrColor, glare.chromaticAberration);
                        }
                    }

                    _time += starDef.rotation ? Engine.ElapsedTime : 0;
                    float radOffset = glare.starInclination + starDef.inclination + _time;

                    Vector2 stepUv;
                    int     lines = starDef.StarLines.Length;

                    float attnPowScaleInicial = (fTanFoV + 0.1f) * 1.0f * (160.0f + 120.0f) / (srcW + srcH) * 1.2f;

                    for (int d = 0; d < lines; d++)
                    {
                        Starline starLine = starDef.StarLines[d];
                        float    rad      = radOffset + starLine.Inclination;
                        float    sn       = (float)Math.Sin(rad);
                        float    cs       = (float)Math.Cos(rad);
                        stepUv.X = sn / srcW * starLine.SampleLength;
                        stepUv.Y = cs / srcH * starLine.SampleLength;

                        float attnPowScale = attnPowScaleInicial;

                        #region PASSES
                        // 1 direction expansion loop
                        source = _rtStartSource;
                        dest   = _rtStarPasses[0];
                        for (int p = 0; p < starLine.Passes; p++)
                        {
                            if (p == starLine.Passes - 1)
                            {
                                source = dest;
                                dest   = _rtStarLines[d];
                            }
                            // Sampling configration for each stage
                            for (i = 0; i < samples; i++)
                            {
                                float lum = (float)Math.Pow(starLine.Attenuation, attnPowScale * i);

                                ptSampleWeights[i] = _sAaColor[starLine.Passes - 1 - p, i] * lum * (p + 1.0f) * 0.5f;

                                // Offset of sampling coordinate
                                ptSampleOffsets[i].X = stepUv.X * i;
                                ptSampleOffsets[i].Y = stepUv.Y * i;
                                if (Math.Abs(ptSampleOffsets[i].X) >= 0.9f || Math.Abs(ptSampleOffsets[i].Y) >= 0.9f)
                                {
                                    ptSampleOffsets[i] = Vector2.Zero;
                                    ptSampleWeights[i] = Vector4.Zero;
                                }
                            }

                            effect.Technique = HdrEffect.Star;
                            dest.SetTarget(device);
                            source.SetTexture(0, device);

                            _map.SampleOffsets = _sampleOffsetsStar;
                            _map.SampleWeights = _sampleWeightsStar;

                            _quadRender.DrawQuad(effect);

                            // Setup next expansion
                            stepUv       *= samples;
                            attnPowScale *= samples;

                            // Set the work drawn just before to next texture source.
                            if (p == 0)
                            {
                                source = dest;
                                dest   = _rtStarPasses[1];
                            }
                            else if (p != starLine.Passes - 1)
                            {
                                var rtTemp = source;
                                source = dest;
                                dest   = source;
                            }
                        }

                        #endregion PASSES
                    }

                    dest = _rtStarFinal;
                    dest.SetTarget(device);

                    float invLines = 1.0f / (float)lines;
                    for (i = 0; i < lines; i++)
                    {
                        _rtStarLines[i].SetTexture(i, device);
                        device.PS.SetSampler(i, _linearSampler);
                        ptSampleWeights[i] = new Vector4(invLines, invLines, invLines, invLines);
                    }

                    effect.Technique   = HdrEffect.MergeTexture;
                    _map.NbTextures    = lines;
                    _map.SampleWeights = _sampleWeightsStar;

                    _quadRender.DrawQuad(effect);

                    //for (i = 0; i < lines; i++)
                    //{
                    //    device.PSStage.SetSampler(i, pointSampler);
                    //}
                }
            }
        }
Example #9
0
        public override void Apply()
        {
            if (_gaussianMean != _state.GaussainMean ||
                _gaussianDev != _state.GaussianDeviation ||
                _gaussainMultiplier != _state.GaussianMultiplier)
            {
                ComputeSamples();
            }

            var device = GraphicDeviceFactory.Device;

            device.SaveRenderTarget();

            RenderTexture2D dest;
            RenderTexture2D source;
            RenderTexture2D lumen;
            var             stage = device.PS;
            var             scene = Engine.Scene;

            #region Render To HDRTexture

            _rtHdrScene.SetTarget(device);
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Engine.BackColor, 1, 0);

            RenderManager.PopTechnique();
            RenderManager.ApplyTechnique();
            RenderManager.PushTechnique(this);

            #endregion

            _quadRender.Begin();
            _quadRender.SetFullScreenTransform(_input);

            stage.SetSampler(0, _pointSampler);
            stage.SetSampler(1, _pointSampler);

            MensureLuminance(device, stage);

            #region CalculateAdaptation

            if (_state.CalculateEyeAdaptation)
            {
                effect.Technique = HdrEffect.CalculateAdaptedLum;

                //swap last width current
                var rtTemp = _rtLastAdaptedLuminance;
                _rtLastAdaptedLuminance    = _rtCurrentAdaptedLuminance;
                _rtCurrentAdaptedLuminance = rtTemp;

                _rtCurrentAdaptedLuminance.SetTarget(device);

                _rtLastAdaptedLuminance.SetTexture(0, device);
                _rtToneMap[0].SetTexture(1, device);

                _map.ElapsedTime = Engine.ElapsedTime;
                _quadRender.DrawQuad(effect);

                lumen = _rtCurrentAdaptedLuminance;
            }
            else
            {
                lumen = _rtToneMap[0];
            }
            #endregion

            #region BrightPassFilter

            effect.Technique = HdrEffect.BrightPassFilter;
            _rtBrightPassFilter.SetTarget(device);

            _rtHdrScene.SetTexture(0, device);
            lumen.SetTexture(1, device);

            _map.MiddleGray          = _state.MiddleGray;
            _map.BrightPassThreshold = _state.BrightThreshold;

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);

            #endregion

            stage.SetSampler(0, _linearSampler);

            #region BloomFilter

            #region DownSample 4x4

            effect.Technique = HdrEffect.DownSampler4X4;
            dest             = _rtBloom[2];
            source           = _rtBrightPassFilter;

            dest.SetTarget(device);
            source.SetTexture(0, device);
            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);

            _quadRender.DrawQuad(effect);

            #endregion

            #region Horizontal Blur

            effect.Technique = HdrEffect.Bloom;
            //Horizontal Blur
            source = _rtBloom[2];
            dest   = _rtBloom[1];

            dest.SetTarget(device);
            source.SetTexture(0, device);
            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);

            _map.SampleOffsets = _sampleOffsetsH;
            _map.SampleWeights = _sampleWeights;

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);

            #endregion

            #region Vertical Blur
            source = _rtBloom[1];
            dest   = _rtBloom[0];

            dest.SetTarget(device);
            source.SetTexture(0, device);

            _map.SampleOffsets = _sampleOffsetsV;
            _map.SampleWeights = _sampleWeights;

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);

            #endregion

            #endregion

            #region StarFilter

            RenderStar(device);

            #endregion

            #region FinalPass

            effect.Technique = HdrEffect.FinalScenePass;

            device.RestoreRenderTarget();

            stage.SetSampler(0, _pointSampler);
            stage.SetSampler(1, _pointSampler);
            stage.SetSampler(2, _linearSampler);
            stage.SetSampler(3, _linearSampler);

            _rtHdrScene.SetTexture(0, device);
            lumen.SetTexture(1, device);
            _rtBloom[0].SetTexture(2, device);
            _rtStarFinal.SetTexture(3, device);

            _map.MiddleGray = _state.MiddleGray;

            var glare = _state.Glare;
            if (glare == null || glare.glareLuminance <= 0.0f || glare.starLuminance <= 0.0f)
            {
                _map.GaussianScalar = _state.GaussianMultiplier;
            }
            else
            {
                _map.GaussianScalar = 2 * _state.GaussianMultiplier;
            }

            _map.EnableBlueShift = _state.EnableBlueShift;
            _map.StarBlend       = _state.StarBlendFactor;
            _map.BloomBlend      = _state.BloomBlendFactor;

            device.Clear(ClearFlags.Target, Color4.Black, 1, 0);
            _quadRender.DrawQuad(effect);

            stage.SetResource(0, null);
            stage.SetResource(1, null);
            stage.SetResource(2, null);
            stage.SetResource(3, null);

            #endregion

            _quadRender.End();
            //device.PopGraphicState<BlendState>();
        }