Exemple #1
0
        public void UpdateRenderTargetSize(CanvasDevice device, GameGeometry geometry)
        {
            RenderTargetAspectRatio = geometry.AspectRatio;
            if (RenderTargetAspectRatio < 0.1f)
            {
                RenderTargetAspectRatio = (float)(geometry.BaseWidth) / geometry.BaseHeight;
            }

            if (RenderTarget != null)
            {
                var currentSize = RenderTarget.Size;
                if (currentSize.Width >= geometry.MaxWidth && currentSize.Height >= geometry.MaxHeight)
                {
                    return;
                }
            }

            lock (RenderTargetLock)
            {
                var size = Math.Max(Math.Max(geometry.MaxWidth, geometry.MaxHeight), RenderTargetMinSize);
                size = ClosestGreaterPowerTwo(size);

                RenderTarget?.Dispose();
                RenderTargetSurface?.Dispose();
                RenderTargetSurface = D3DSurfaceMap.CreateMappableD3DSurface(device, size, size);
                RenderTarget        = CanvasBitmap.CreateFromDirect3D11Surface(device, RenderTargetSurface);
            }
        }
Exemple #2
0
        public void LinearizeDepth(RenderTargetSurface dst, ShaderResource src)
        {
            throw new NotImplementedException();
                #if false
            Debug.Assert(Game.IsServiceExist <Camera>());

            var camera = Game.GetService <Camera>();

            bufLinearizeDepth.Data.linearizeDepthA = 1.0f / camera.FrustumZFar - 1.0f / camera.FrustumZNear;
            bufLinearizeDepth.Data.linearizeDepthB = 1.0f / camera.FrustumZNear;
            bufLinearizeDepth.UpdateCBuffer();


            var isDepthMSAA = (src.SampleCount > 1);
            var depthShader = (int)(isDepthMSAA ? ShaderFlags.RESOLVE_AND_LINEARIZE_DEPTH_MSAA : ShaderFlags.LINEARIZE_DEPTH);

            string signature;

            SetDefaultRenderStates();

            using (new PixEvent()) {
                bufLinearizeDepth.SetCBufferPS(0);

                shaders.SetPixelShader(depthShader);
                shaders.SetVertexShader(depthShader);

                dst.SetViewport();
                device.SetRenderTargets(dst);
                src.SetPS(0);

                device.Draw(Primitive.TriangleList, 3, 0);
            }
            device.ResetStates();
                #endif
        }
Exemple #3
0
        /*-----------------------------------------------------------------------------------------------
        *
        *	Base filters
        *
        *  -----------------------------------------------------------------------------------------------*/

        /// <summary>
        /// Performs good-old StretchRect to destination buffer with blending.
        /// </summary>
        /// <param name="dst"></param>
        /// <param name="src"></param>
        /// <param name="filter"></param>
        /// <param name="rect"></param>
        public void StretchRect(RenderTargetSurface dst, ShaderResource src, SamplerState filter = null, bool flipToCubeFace = false)
        {
            SetDefaultRenderStates();

            using (new PixEvent("StretchRect")) {
                SetViewport(dst);
                device.SetTargets(null, dst);

                if (flipToCubeFace)
                {
                    device.PipelineState = factory[(int)(ShaderFlags.STRETCH_RECT | ShaderFlags.TO_CUBE_FACE)];
                }
                else
                {
                    device.PipelineState = factory[(int)ShaderFlags.STRETCH_RECT];
                }
                device.VertexShaderResources[0] = src;
                device.PixelShaderResources[0]  = src;
                device.PixelShaderSamplers[0]   = filter ?? SamplerState.LinearPointClamp;
                device.VertexShaderConstants[0] = sourceRectCB;

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #4
0
        public void Dispose()
        {
            RenderTarget?.Dispose();
            RenderTarget = null;

            RenderTargetSurface?.Dispose();
            RenderTargetSurface = null;
        }
Exemple #5
0
        /// <summary>
        /// Draws sprite laters and all sublayers.
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="stereoEye"></param>
        public void DrawSprites(GameTime gameTime, StereoEye stereoEye, RenderTargetSurface surface, IEnumerable <SpriteLayer> layers)
        {
            device.ResetStates();
            //device.RestoreBackbuffer();
            device.SetTargets(null, surface);

            DrawSpritesRecursive(gameTime, stereoEye, surface, layers, Matrix.Identity, new Color4(1f, 1f, 1f, 1f));
        }
Exemple #6
0
        /*-----------------------------------------------------------------------------------------------
        *
        *	Base filters
        *
        *  -----------------------------------------------------------------------------------------------*/

        /// <summary>
        /// Performs good-old StretchRect to destination buffer with blending.
        /// </summary>
        /// <param name="dst"></param>
        /// <param name="src"></param>
        /// <param name="blendState"></param>
        public void StretchRect(RenderTargetSurface dst, ShaderResource src, SamplerState filter = null)
        {
            SetDefaultRenderStates();

            using (new PixEvent()) {
                SetViewport(dst);
                rs.SetTargets(null, dst);

                rs.PipelineState            = factory[(int)ShaderFlags.DOWNSAMPLE_2_2x2];
                rs.VertexShaderResources[0] = src;
                rs.PixelShaderResources[0]  = src;
                rs.PixelShaderSamplers[0]   = filter ?? SamplerState.LinearPointClamp;

                rs.Draw(3, 0);
            }
            rs.ResetStates();
        }
Exemple #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dst">target to copy to</param>
        /// <param name="src">target to copy from</param>
        public void FillAlphaOne(RenderTargetSurface dst)
        {
            SetDefaultRenderStates();

            using (new PixEvent("FillAlphaOne")) {
                if (dst == null)
                {
                    device.RestoreBackbuffer();
                }
                else
                {
                    SetViewport(dst);
                    device.SetTargets(null, dst);
                }

                device.PipelineState = factory[(int)ShaderFlags.FILL_ALPHA_ONE];

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dst">target to copy to</param>
        /// <param name="src">target to copy from</param>
        public void OverlayAdditive(RenderTargetSurface dst, ShaderResource src)
        {
            SetDefaultRenderStates();

            using (new PixEvent("OverlayAdditive")) {
                if (dst == null)
                {
                    device.RestoreBackbuffer();
                }
                else
                {
                    device.SetTargets(null, dst);
                }

                device.PipelineState           = factory[(int)ShaderFlags.OVERLAY_ADDITIVE];
                device.PixelShaderResources[0] = src;

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dst">target to copy to</param>
        /// <param name="src">target to copy from</param>
        public void CopyAlpha(RenderTargetSurface dst, ShaderResource src)
        {
            SetDefaultRenderStates();

            using (new PixEvent("Copy")) {
                if (dst == null)
                {
                    device.RestoreBackbuffer();
                }
                else
                {
                    SetViewport(dst);
                    device.SetTargets(null, dst);
                }

                device.PipelineState           = factory[(int)ShaderFlags.COPY_ALPHA];
                device.PixelShaderResources[0] = src;

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dst">target to copy to</param>
        /// <param name="src">target to copy from</param>
        public void Copy(RenderTargetSurface dst, ShaderResource src)
        {
            SetDefaultRenderStates();

            using (new PixEvent()) {
                if (dst == null)
                {
                    rs.RestoreBackbuffer();
                }
                else
                {
                    SetViewport(dst);
                    rs.SetTargets(null, dst);
                }

                rs.PipelineState           = factory[(int)ShaderFlags.COPY];
                rs.PixelShaderResources[0] = src;

                rs.Draw(3, 0);
            }
            rs.ResetStates();
        }
Exemple #11
0
        public void RadialBlur(RenderTargetSurface dst, RenderTarget2D src, Vector2 blurPoint, float offset, float size)
        {
            SetDefaultRenderStates();

            var data = new Vector4(blurPoint.X, blurPoint.Y, offset, size);

            radialDataCB.SetData(data);

            using (new PixEvent()) {
                rs.SetTargets(null, dst);
                SetViewport(dst);

                rs.PipelineState            = factory[(int)ShaderFlags.RADIAL_BLUR];
                rs.VertexShaderResources[0] = src;
                rs.PixelShaderResources[0]  = src;
                rs.PixelShaderSamplers[0]   = SamplerState.LinearPointClamp;
                rs.PixelShaderConstants[0]  = radialDataCB;
                rs.VertexShaderConstants[0] = radialDataCB;

                rs.Draw(3, 0);
            }
            rs.ResetStates();
        }
Exemple #12
0
        /// <summary>
        /// Renders view
        /// </summary>
        internal void Render(GameTime gameTime, StereoEye stereoEye, RenderTargetSurface targetSurface)
        {
            if (captureRadiance)
            {
                RenderRadiance();
                captureRadiance = false;
            }

            //	clear target buffer if necassary :
            if (Clear)
            {
                rs.Device.Clear(targetSurface, ClearColor);
            }

            var viewport = new Viewport(0, 0, targetSurface.Width, targetSurface.Height);

            //	Render HDR stuff: mesh instances,
            //	special effects, sky, water, light etc.
            RenderHdrScene(gameTime, stereoEye, viewport, targetSurface);

            //	fill alpha with one value :
            rs.Filter.FillAlphaOne(targetSurface);
        }
Exemple #13
0
        /// <summary>
        /// Performs FXAA antialiasing.
        /// </summary>
        /// <param name="dst">Target buffer to render FXAA to</param>
        /// <param name="src">Source image with luminance in alpha</param>
        public void Fxaa(RenderTargetSurface dst, ShaderResource src)
        {
            SetDefaultRenderStates();

            using (new PixEvent("Fxaa")) {
                if (dst == null)
                {
                    device.RestoreBackbuffer();
                }
                else
                {
                    SetViewport(dst);
                    device.SetTargets(null, dst);
                }

                device.PipelineState            = factory[(int)ShaderFlags.FXAA];
                device.VertexShaderResources[0] = src;
                device.PixelShaderResources[0]  = src;
                device.PixelShaderSamplers[0]   = SamplerState.LinearPointClamp;

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #14
0
        public void StretchRect4x4(RenderTargetSurface dst, RenderTarget2D src, SamplerState filter = null, bool flipToCubeFace = false)
        {
            SetDefaultRenderStates();

            using (new PixEvent("StretchRect4x4")) {
                device.SetTargets(null, dst);
                SetViewport(dst);

                if (flipToCubeFace)
                {
                    device.PipelineState = factory[(int)(ShaderFlags.DOWNSAMPLE_2_4x4 | ShaderFlags.TO_CUBE_FACE)];
                }
                else
                {
                    device.PipelineState = factory[(int)ShaderFlags.DOWNSAMPLE_2_4x4];
                }
                device.VertexShaderResources[0] = src;
                device.PixelShaderResources[0]  = src;
                device.PixelShaderSamplers[0]   = filter ?? SamplerState.LinearPointClamp;

                device.Draw(3, 0);
            }
            device.ResetStates();
        }
Exemple #15
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="gameTime"></param>
        internal void RenderShadow(GameTime gameTime, Viewport viewport, Matrix view, Matrix projection, RenderTargetSurface particleShadow, DepthStencilSurface depthBuffer)
        {
            if (rs.SkipParticleShadows)
            {
                return;
            }

            var colorTarget = particleShadow;
            var depthTarget = depthBuffer;

            RenderGeneric("Particles Shadow", gameTime, null, viewport, view, projection, colorTarget, depthTarget, null, Flags.DRAW_SHADOW);
        }
Exemple #16
0
        /// <summary>
        ///
        /// </summary>
        void RenderGeneric(string passName, GameTime gameTime, Camera camera, Viewport viewport, Matrix view, Matrix projection, RenderTargetSurface colorTarget, DepthStencilSurface depthTarget, ShaderResource depthValues, Flags flags)
        {
            var device = Game.GraphicsDevice;

            using (new PixEvent(passName)) {
                device.ResetStates();

                //
                //	Setup images :
                //
                if (Images != null && !Images.IsDisposed)
                {
                    imagesCB.SetData(Images.GetNormalizedRectangles(MaxImages));
                }

                SetupGPUParameters(0, renderWorld, view, projection, flags);
                device.ComputeShaderConstants[0] = paramsCB;

                //
                //	Render
                //
                using (new PixEvent("Drawing")) {
                    //	target and viewport :
                    device.SetTargets(depthTarget, colorTarget);
                    device.SetViewport(viewport);

                    //	params CB :
                    device.ComputeShaderConstants[0]  = paramsCB;
                    device.VertexShaderConstants[0]   = paramsCB;
                    device.GeometryShaderConstants[0] = paramsCB;
                    device.PixelShaderConstants[0]    = paramsCB;

                    //	atlas CB :
                    device.VertexShaderConstants[1]   = imagesCB;
                    device.GeometryShaderConstants[1] = imagesCB;
                    device.PixelShaderConstants[1]    = imagesCB;

                    //	sampler & textures :
                    device.PixelShaderSamplers[0] = SamplerState.LinearClamp4Mips;

                    device.PixelShaderResources[0]    = Images == null? rs.WhiteTexture.Srv : Images.Texture.Srv;
                    device.PixelShaderResources[5]    = depthValues;
                    device.GeometryShaderResources[1] = simulationBuffer;
                    device.GeometryShaderResources[2] = simulationBuffer;
                    device.GeometryShaderResources[3] = sortParticlesBuffer;
                    device.GeometryShaderResources[4] = particleLighting;

                    //	setup PS :
                    device.PipelineState = factory[(int)flags];

                    //	GPU time : 0.81 ms	-> 0.91 ms
                    device.Draw(MaxSimulatedParticles, 0);
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="view"></param>
        /// <param name="projection"></param>
        public void RenderLighting(Matrix view, Matrix projection, RenderTargetSurface hdrTarget, ShaderResource occlusionMap)
        {
            var device = Game.GraphicsDevice;

            device.ResetStates();

            LightingFlags flags = LightingFlags.NONE;

            if (!Config.SkipDirectLight)
            {
                flags |= LightingFlags.DIRECT;

                if (Config.ShowCSMSplits)
                {
                    flags |= LightingFlags.SHOW_SPLITS;
                }
            }
            if (!Config.SkipOmniLights)
            {
                flags |= LightingFlags.OMNI;

                if (Config.ShowOmniLightTileLoad)
                {
                    flags |= LightingFlags.SHOW_OMNI_LOAD;
                }
            }
            if (!Config.SkipSpotLights)
            {
                flags |= LightingFlags.SPOT;

                if (Config.ShowSpotLightTileLoad)
                {
                    flags |= LightingFlags.SHOW_SPOT_LOAD;
                }
            }
            if (Config.UseUE4LightingModel)
            {
                flags |= LightingFlags.USE_UE4;
            }



            //
            //	Setup compute shader parameters and states :
            //
            try {
                device.PipelineState = factory[(int)flags];

                //lightingShader.SetComputeShader((int)flags);

                var cbData  = new LightingParams();
                var invView = Matrix.Invert(view);
                var invVP   = Matrix.Invert(view * projection);
                var viewPos = invView.TranslationVector;


                cbData.DirectLightDirection = new Vector4(DirectLightDirection, 0);
                cbData.DirectLightIntensity = DirectLightIntensity.ToVector4();
                cbData.Projection           = projection;

                cbData.CSMViewProjection0 = csmViewProjections[0];
                cbData.CSMViewProjection1 = csmViewProjections[1];
                cbData.CSMViewProjection2 = csmViewProjections[2];
                cbData.CSMViewProjection3 = csmViewProjections[3];

                cbData.View                  = view;
                cbData.ViewPosition          = new Vector4(viewPos, 1);
                cbData.InverseViewProjection = invVP;
                cbData.CSMFilterRadius       = new Vector4(Config.CSMFilterSize);

                cbData.AmbientColor = AmbientLevel;

                PrepareOmniLights(view, projection);
                PrepareSpotLights(view, projection);

                //
                //	set states :
                //
                device.SetTargets(null, hdrTarget);

                lightingCB.SetData(cbData);

                device.ComputeShaderSamplers[0] = SamplerState.PointClamp;
                device.ComputeShaderSamplers[1] = SamplerState.LinearClamp;
                device.ComputeShaderSamplers[2] = SamplerState.ShadowSampler;

                device.ComputeShaderResources[0] = diffuseBuffer;
                device.ComputeShaderResources[1] = specularBuffer;
                device.ComputeShaderResources[2] = normalMapBuffer;
                device.ComputeShaderResources[3] = depthBuffer;
                device.ComputeShaderResources[4] = csmColor;
                device.ComputeShaderResources[5] = spotColor;
                device.ComputeShaderResources[6] = MaskAtlas.Texture;
                device.ComputeShaderResources[7] = omniLightBuffer;
                device.ComputeShaderResources[8] = spotLightBuffer;
                device.ComputeShaderResources[9] = occlusionMap;

                device.ComputeShaderConstants[0] = lightingCB;

                device.SetCSRWTexture(0, lightAccumBuffer.Surface);

                //
                //	Dispatch :
                //
                device.Dispatch(MathUtil.IntDivUp(hdrTarget.Width, BlockSizeX), MathUtil.IntDivUp(hdrTarget.Height, BlockSizeY), 1);
            } catch (UbershaderException e) {
                e.Report();
            }


            //device.DisplayBounds

            //
            //	Add accumulated light  :
            //
            device.ResetStates();
            device.SetTargets(null, hdrTarget);

            var sb = Game.GetService <SpriteBatch>();

            sb.Begin(SpriteBlend.Additive);

            sb.Draw(lightAccumBuffer, 0, 0, lightAccumBuffer.Width, lightAccumBuffer.Height, Color.White);

            sb.End();

            device.ResetStates();



            /*if ( Config.ShowSpotLightExtents ) {
             *      device.ResetStates();
             *      device.SetTargets( null, hdrTarget );
             *
             *      var sb = Game.GetService<SpriteBatch>();
             *      sb.Begin( BlendState.Additive );
             *              foreach ( var spot in spotLightData ) {
             *
             *                      sb.Draw( sb.TextureWhite,
             *                              spot.ExtentMin.X,
             *                              spot.ExtentMin.Y,
             *                              spot.ExtentMax.X-spot.ExtentMin.X,
             *                              spot.ExtentMax.Y-spot.ExtentMin.Y,
             *                              new Color(32,0,32,255) );
             *
             *              }
             *      sb.End();
             * } */
        }
Exemple #18
0
 public void CopyColor(RenderTargetSurface dst, ShaderResource src)
 {
     Copy(dst, src);
 }
Exemple #19
0
 void SetViewport(RenderTargetSurface dst)
 {
     device.SetViewport(0, 0, dst.Width, dst.Height);
 }
Exemple #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="stereoEye"></param>
        void RenderHdrScene(GameTime gameTime, StereoEye stereoEye, Viewport viewport, RenderTargetSurface targetSurface)
        {
            //	clear g-buffer and hdr-buffers:
            ClearBuffers(viewHdrFrame);

            //	single pass for stereo rendering :
            if (stereoEye != StereoEye.Right)
            {
                //	simulate particles BEFORE lighting
                //	to make particle lit (position is required) and
                //	get simulated particles for shadows.
                ParticleSystem.Simulate(gameTime, Camera);

                //	render shadows :
                rs.LightRenderer.RenderShadows(this, this.LightSet);
            }


            //	render g-buffer :
            rs.SceneRenderer.RenderGBuffer(gameTime, stereoEye, Camera, viewHdrFrame, this, false);

            //	render ssao :
            rs.SsaoFilter.Render(stereoEye, Camera, viewHdrFrame.DepthBuffer, viewHdrFrame.GBuffer1);

            switch (rs.ShowGBuffer)
            {
            case 1: rs.Filter.CopyColor(targetSurface, viewHdrFrame.GBuffer0); return;

            case 2: rs.Filter.CopyAlpha(targetSurface, viewHdrFrame.GBuffer0); return;

            case 3: rs.Filter.CopyColor(targetSurface, viewHdrFrame.GBuffer1); return;

            case 4: rs.Filter.CopyAlpha(targetSurface, viewHdrFrame.GBuffer1); return;

            case 5: rs.Filter.CopyColor(targetSurface, viewHdrFrame.HdrBuffer); return;

            case 6: rs.Filter.Copy(targetSurface, rs.SsaoFilter.OcclusionMap); return;

            case 7: rs.Filter.StretchRect(targetSurface, rs.LightRenderer.CascadedShadowMap.ParticleShadow); return;

            case 8: rs.Filter.StretchRect(targetSurface, rs.LightRenderer.CascadedShadowMap.ColorBuffer); return;

            case 9: rs.Filter.StretchRect(targetSurface, viewHdrFrame.FeedbackBufferRB, SamplerState.PointClamp); return;
            }

            if (rs.VTSystem.ShowPhysicalTextures)
            {
                rs.Filter.StretchRect(targetSurface, rs.VTSystem.PhysicalPages0);
                return;
            }
            if (rs.VTSystem.ShowPageTexture)
            {
                rs.Filter.Copy(targetSurface, rs.VTSystem.PageTable);
                return;
            }

            //	render sky :
            rs.Sky.Render(Camera, stereoEye, viewHdrFrame, SkySettings);
            rs.Sky.RenderFogTable(SkySettings);

            //	render lights :
            rs.LightRenderer.RenderLighting(stereoEye, Camera, viewHdrFrame, this, Radiance);

            //	render "solid" DOF :
            rs.DofFilter.Render(gameTime, viewHdrFrame.LightAccumulator, viewHdrFrame.HdrBuffer, viewHdrFrame.DepthBuffer, this);

            //	render and simulate particles :
            ParticleSystem.Render(gameTime, Camera, stereoEye, viewHdrFrame);

            //	apply tonemapping and bloom :
            rs.HdrFilter.Render(gameTime, TempFXBuffer.Surface, viewHdrFrame.HdrBuffer, this);


            //	apply FXAA
            if (rs.UseFXAA)
            {
                rs.Filter.Fxaa(targetSurface, TempFXBuffer);
            }
            else
            {
                rs.Filter.Copy(targetSurface, TempFXBuffer);
            }

            //	draw debug lines :
            Debug.Render(targetSurface, viewHdrFrame.DepthBuffer.Surface, Camera);
        }
Exemple #21
0
        /// <summary>
        /// Performs luminance measurement, tonemapping, applies bloom.
        /// </summary>
        /// <param name="target">LDR target.</param>
        /// <param name="hdrImage">HDR source image.</param>
        public void Render(GameTime gameTime, RenderTargetSurface target, ShaderResource hdrImage, RenderWorld viewLayer)
        {
            var device = Game.GraphicsDevice;
            var filter = Game.RenderSystem.Filter;

            var settings = viewLayer.HdrSettings;

            using (new PixEvent("HDR Postprocessing")) {
                //
                //	Rough downsampling of source HDR-image :
                //
                filter.StretchRect(averageLum.Surface, hdrImage, SamplerState.PointClamp);
                averageLum.BuildMipmaps();

                //
                //	Make bloom :
                //
                filter.StretchRect(viewLayer.Bloom0.Surface, hdrImage, SamplerState.LinearClamp);
                viewLayer.Bloom0.BuildMipmaps();

                filter.GaussBlur(viewLayer.Bloom0, viewLayer.Bloom1, settings.GaussBlurSigma, 0);
                filter.GaussBlur(viewLayer.Bloom0, viewLayer.Bloom1, settings.GaussBlurSigma, 1);
                filter.GaussBlur(viewLayer.Bloom0, viewLayer.Bloom1, settings.GaussBlurSigma, 2);
                filter.GaussBlur(viewLayer.Bloom0, viewLayer.Bloom1, settings.GaussBlurSigma, 3);

                //
                //	Setup parameters :
                //
                var paramsData = new Params();
                paramsData.AdaptationRate     = 1 - (float)Math.Pow(0.5f, gameTime.ElapsedSec / settings.AdaptationHalfLife);
                paramsData.LuminanceLowBound  = settings.LuminanceLowBound;
                paramsData.LuminanceHighBound = settings.LuminanceHighBound;
                paramsData.KeyValue           = settings.KeyValue;
                paramsData.BloomAmount        = settings.BloomAmount;
                paramsData.DirtMaskLerpFactor = settings.DirtMaskLerpFactor;
                paramsData.DirtAmount         = settings.DirtAmount;
                paramsData.Saturation         = settings.Saturation;
                paramsData.MaximumOutputValue = settings.MaximumOutputValue;
                paramsData.MinimumOutputValue = settings.MinimumOutputValue;
                paramsData.DitherAmount       = settings.DitherAmount;

                paramsCB.SetData(paramsData);
                device.PixelShaderConstants[0] = paramsCB;

                //
                //	Measure and adapt :
                //
                device.SetTargets(null, viewLayer.MeasuredNew);

                device.PixelShaderResources[0] = averageLum;
                device.PixelShaderResources[1] = viewLayer.MeasuredOld;

                device.PipelineState = factory[(int)(Flags.MEASURE_ADAPT)];

                device.Draw(3, 0);


                //
                //	Tonemap and compose :
                //
                device.SetTargets(null, target);

                device.PixelShaderResources[0] = hdrImage;                       // averageLum;
                device.PixelShaderResources[1] = viewLayer.MeasuredNew;          // averageLum;
                device.PixelShaderResources[2] = viewLayer.Bloom0;               // averageLum;
                device.PixelShaderResources[3] = settings.DirtMask1 == null ? whiteTex.Srv : settings.DirtMask1.Srv;
                device.PixelShaderResources[4] = settings.DirtMask2 == null ? whiteTex.Srv : settings.DirtMask2.Srv;
                device.PixelShaderResources[5] = noiseTex.Srv;
                device.PixelShaderSamplers[0]  = SamplerState.LinearClamp;

                Flags op = Flags.LINEAR;
                if (settings.TonemappingOperator == TonemappingOperator.Filmic)
                {
                    op = Flags.FILMIC;
                }
                if (settings.TonemappingOperator == TonemappingOperator.Linear)
                {
                    op = Flags.LINEAR;
                }
                if (settings.TonemappingOperator == TonemappingOperator.Reinhard)
                {
                    op = Flags.REINHARD;
                }

                device.PipelineState = factory[(int)(Flags.TONEMAPPING | op)];

                device.Draw(3, 0);

                device.ResetStates();


                //	swap luminanice buffers :
                Misc.Swap(ref viewLayer.MeasuredNew, ref viewLayer.MeasuredOld);
            }
        }
Exemple #22
0
        /// <summary>
        /// Draw sprite layers
        /// </summary>
        /// <param name="gameTime"></param>
        /// <param name="stereoEye"></param>
        /// <param name="layers"></param>
        void DrawSpritesRecursive(GameTime gameTime, StereoEye stereoEye, RenderTargetSurface surface, IEnumerable <SpriteLayer> layers, Matrix parentTransform, Color4 parentColor)
        {
            int w   = surface.Width;
            int h   = surface.Height;
            var ofs = 0f;

            var projection = Matrix.OrthoOffCenterRH(ofs, w + ofs, h + ofs, ofs, -9999, 9999);

            var orderedLayers = layers.Where(layer0 => layer0 != null).OrderBy(layer1 => layer1.Order);

            foreach (var layer in orderedLayers)
            {
                if (!layer.Visible)
                {
                    continue;
                }

                using (new PixEvent("SpriteLayer")) {
                    Matrix absTransform = parentTransform * layer.Transform;
                    Color4 absColor     = parentColor * layer.Color.ToColor4();

                    constData.Transform     = absTransform * projection;
                    constData.ClipRectangle = new Vector4(0, 0, 0, 0);
                    constData.MasterColor   = absColor;

                    constBuffer.SetData(constData);

                    device.VertexShaderConstants[0] = constBuffer;
                    device.PixelShaderConstants[0]  = constBuffer;

                    PipelineState ps = null;
                    SamplerState  ss = null;

                    switch (layer.FilterMode)
                    {
                    case SpriteFilterMode.PointClamp: ss = SamplerState.PointClamp;                 break;

                    case SpriteFilterMode.PointWrap: ss = SamplerState.PointWrap;                  break;

                    case SpriteFilterMode.LinearClamp: ss = SamplerState.LinearClamp;                break;

                    case SpriteFilterMode.LinearWrap: ss = SamplerState.LinearWrap;                 break;

                    case SpriteFilterMode.AnisotropicClamp: ss = SamplerState.AnisotropicClamp;   break;

                    case SpriteFilterMode.AnisotropicWrap: ss = SamplerState.AnisotropicWrap;    break;
                    }

                    switch (layer.BlendMode)
                    {
                    case SpriteBlendMode.Opaque: ps = factory[(int)Flags.OPAQUE]; break;

                    case SpriteBlendMode.AlphaBlend: ps = factory[(int)Flags.ALPHA_BLEND]; break;

                    case SpriteBlendMode.AlphaBlendPremul: ps = factory[(int)Flags.ALPHA_BLEND_PREMUL]; break;

                    case SpriteBlendMode.Additive: ps = factory[(int)Flags.ADDITIVE]; break;

                    case SpriteBlendMode.Screen: ps = factory[(int)Flags.SCREEN]; break;

                    case SpriteBlendMode.Multiply: ps = factory[(int)Flags.MULTIPLY]; break;

                    case SpriteBlendMode.NegMultiply: ps = factory[(int)Flags.NEG_MULTIPLY]; break;

                    case SpriteBlendMode.AlphaOnly: ps = factory[(int)Flags.ALPHA_ONLY]; break;
                    }

                    device.PipelineState          = ps;
                    device.PixelShaderSamplers[0] = ss;

                    layer.Draw(gameTime, stereoEye);

                    DrawSpritesRecursive(gameTime, stereoEye, surface, layer.Layers, absTransform, absColor);
                }
            }
        }
Exemple #23
0
        /// <summary>
        /// Renders sky with specified technique
        /// </summary>
        /// <param name="rendCtxt"></param>
        /// <param name="techName"></param>
        public void Render(GameTime gameTime, DepthStencilSurface depthBuffer, RenderTargetSurface hdrTarget, Matrix view, Matrix projection, RenderTarget2D cloudTarget, RenderTarget2D smallerCloudTarget)
        {
            var camera = Game.GetService <Camera>();

            var scale    = Matrix.Scaling(Params.SkySphereSize);
            var rotation = Matrix.Identity;

            var sunPos   = GetSunDirection();
            var sunColor = GetSunGlowColor();

            rs.ResetStates();

            //rs.DepthStencilState = depthBuffer==null? DepthStencilState.None : DepthStencilState.Default ;

            rs.SetViewport(0, 0, hdrTarget.Width, hdrTarget.Height);

            rs.SetTargets(depthBuffer, hdrTarget);

            var viewMatrix = view;
            var projMatrix = projection;

            skyConstsData.MatrixWVP    = scale * rotation * MathUtil.Transformation(viewMatrix.Right, viewMatrix.Up, viewMatrix.Backward) * projMatrix;
            skyConstsData.SunPosition  = sunPos;
            skyConstsData.SunColor     = sunColor;
            skyConstsData.Turbidity    = Params.SkyTurbidity;
            skyConstsData.Temperature  = Temperature.Get(Params.SunTemperature);
            skyConstsData.SkyIntensity = Params.SkyIntensity;

            skyConstsCB.SetData(skyConstsData);

            rs.VertexShaderConstants[0] = skyConstsCB;
            rs.PixelShaderConstants[0]  = skyConstsCB;


            //
            //	Sky :
            //
            SkyFlags flags = SkyFlags.PROCEDURAL_SKY;

            ApplyColorSpace(ref flags);

            rs.PipelineState = factory[(int)flags];

            for (int j = 0; j < skySphere.Meshes.Count; j++)
            {
                var mesh = skySphere.Meshes[j];

                rs.SetupVertexInput(vertexBuffers[j], indexBuffers[j]);
                rs.DrawIndexed(mesh.IndexCount, 0, 0);
            }



            //
            //	Clouds :
            //
            scale = Matrix.Scaling(Params.SkySphereSize, Params.SkySphereSize, Params.SkySphereSize);
            //scale		=	Matrix.Scaling( Params.SkySphereSize, Params.SkySphereSize * 0.1f, Params.SkySphereSize );
            skyConstsData.MatrixWVP    = scale * rotation * MathUtil.Transformation(viewMatrix.Right, viewMatrix.Up, viewMatrix.Backward) * projMatrix;
            skyConstsData.SunPosition  = sunPos;
            skyConstsData.SunColor     = GetSunLightColor();
            skyConstsData.Turbidity    = Params.SkyTurbidity;
            skyConstsData.Temperature  = Temperature.Get(Params.SunTemperature);
            skyConstsData.SkyIntensity = Params.SkyIntensity;
            skyConstsData.Ambient      = GetAmbientLevel().ToVector3();
            skyConstsData.Time         = (float)gameTime.Total.TotalSeconds;

            skyConstsCB.SetData(skyConstsData);

            rs.SetTargets(depthBuffer, hdrTarget);
//			rs.SetTargets( null, cloudTarget.Surface );

            flags = SkyFlags.CLOUDS;

            //int i = 0;
            for (int i = 0; i < 3; i++)
            {
                if (i == 0)
                {
                    flags = SkyFlags.CLOUDS | SkyFlags.A | SkyFlags.RED;
                }
                if (i == 1)
                {
                    flags = SkyFlags.CLOUDS | SkyFlags.B | SkyFlags.GREEN;
                }
                if (i == 2)
                {
                    flags = SkyFlags.CLOUDS | SkyFlags.C | SkyFlags.BLUE;
                }

                ApplyColorSpace(ref flags);

                rs.PipelineState           = factory[(int)flags];
                rs.PixelShaderResources[0] = clouds;
                rs.PixelShaderResources[1] = cirrus;
                rs.PixelShaderResources[2] = noise;
                rs.PixelShaderResources[3] = arrows;
                rs.PixelShaderSamplers[0]  = SamplerState.AnisotropicWrap;



                for (int j = 0; j < cloudSphere.Meshes.Count; j++)
                {
                    var mesh = cloudSphere.Meshes[j];

                    rs.SetupVertexInput(cloudVertexBuffers[j], cloudIndexBuffers[j]);
                    rs.DrawIndexed(mesh.IndexCount, 0, 0);
                }
            }
                        #if false
            //Blur
            var filter = Game.GetService <Filter>();

            //filter.RadialBlur(smallerCloudTarget.Surface, cloudTarget, new Vector2(0.5f, 0.5f), 1.0f, -0.2f);

            //if(Game.InputDevice.IsKeyDown(Keys.LeftButton))
            //{
            Vector4 sunProj = Vector4.Transform(new Vector4(sunPos, 0), viewMatrix);
            sunProj = Vector4.Transform(sunProj, projMatrix);
            sunProj = new Vector4(sunProj.X / sunProj.W, sunProj.Y / sunProj.W, sunProj.Z / sunProj.W, 1);
            Vector2 relSunPosition = new Vector2(0.5f, 0.5f);

            //if ( Math.Abs(sunProj.X ) < 1 && Math.Abs (sunProj.Y) < 1){
            relSunPosition = new Vector2((sunProj.X + 1) / 2, -(sunProj.Y - 1) / 2);
            //}

            //Log.Message(relSunPosition + "");
            filter.RadialBlur(smallerCloudTarget.Surface, cloudTarget, relSunPosition, 1.0f, -0.2f);
            //}



            flags = SkyFlags.BLUR_CLOUD;
            skyConstsData.MatrixWVP = Matrix.Identity;
            skyConstsCB.SetData(skyConstsData);

            rs.SetTargets(null, hdrTarget);

            ApplyColorSpace(ref flags);
            rs.VertexShaderConstants[0] = skyConstsCB;
            rs.PixelShaderConstants[0]  = skyConstsCB;

            rs.PipelineState           = factory[(int)flags];
            rs.PixelShaderResources[4] = cloudTarget;
            rs.PixelShaderSamplers[1]  = SamplerState.LinearWrap;

            var v0 = new VertexColorTextureTBN {
                Position = new Vector3(-1.0f, -1.0f, 0), TexCoord = new Vector2(0, 1),
            };
            var v1 = new VertexColorTextureTBN {
                Position = new Vector3(1.0f, 1.0f, 0), TexCoord = new Vector2(1, 0),
            };
            var v2 = new VertexColorTextureTBN {
                Position = new Vector3(-1.0f, 1.0f, 0), TexCoord = new Vector2(0, 0),
            };
            var v3 = new VertexColorTextureTBN {
                Position = new Vector3(-1.0f, -1.0f, 0), TexCoord = new Vector2(0, 1),
            };
            var v4 = new VertexColorTextureTBN {
                Position = new Vector3(1.0f, -1.0f, 0), TexCoord = new Vector2(1, 1),
            };
            var v5 = new VertexColorTextureTBN {
                Position = new Vector3(1.0f, 1.0f, 0), TexCoord = new Vector2(1, 0),
            };                                                                                                                                    //*/

            var data = new VertexColorTextureTBN[] { v0, v1, v2, v3, v4, v5 };
            //Log.Message(""+v0.TexCoord);
            vertexBufferBlur.SetData(data, 0, 6);
            //for ( int j=0; j<cloudSphere.Meshes.Count; j++) {
            //		var mesh = cloudSphere.Meshes[j];

            //		rs.SetupVertexInput( cloudVertexBuffers[j], cloudIndexBuffers[j] );
            //		rs.DrawIndexed( mesh.IndexCount, 0, 0 );
            //	}
            rs.SetupVertexInput(vertexBufferBlur, null);
            rs.Draw(6, 0);
#endif

            rs.ResetStates();
        }
Exemple #24
0
        /// <summary>
        /// Performs luminance measurement, tonemapping, applies bloom.
        /// </summary>
        /// <param name="target">LDR target.</param>
        /// <param name="hdrImage">HDR source image.</param>
        public void Render(GameTime gameTime, RenderTargetSurface target, ShaderResource hdrImage)
        {
            var device = Game.GraphicsDevice;
            var filter = Game.GetService <Filter>();
            var ds     = Game.GetService <DebugStrings>();


            //
            //	Rough downsampling of source HDR-image :
            //
            filter.StretchRect(averageLum.Surface, hdrImage);
            averageLum.BuildMipmaps();

            //
            //	Make bloom :
            //
            filter.StretchRect(bloom0.Surface, hdrImage);
            bloom0.BuildMipmaps();

            filter.GaussBlur(bloom0, bloom1, Config.GaussBlurSigma, 0);
            filter.GaussBlur(bloom0, bloom1, Config.GaussBlurSigma, 1);
            filter.GaussBlur(bloom0, bloom1, Config.GaussBlurSigma, 2);
            filter.GaussBlur(bloom0, bloom1, Config.GaussBlurSigma, 3);


            //
            //	Setup parameters :
            //
            var paramsData = new Params();

            paramsData.AdaptationRate     = 1 - (float)Math.Pow(0.5f, gameTime.ElapsedSec / Config.AdaptationHalfLife);
            paramsData.LuminanceLowBound  = Config.LuminanceLowBound;
            paramsData.LuminanceHighBound = Config.LuminanceHighBound;
            paramsData.KeyValue           = Config.KeyValue;
            paramsData.BloomAmount        = Config.BloomAmount;

            paramsCB.SetData(paramsData);
            device.PixelShaderConstants[0] = paramsCB;


            //
            //	Measure and adapt :
            //
            device.SetTargets(null, measuredNew);

            device.PixelShaderResources[0] = averageLum;
            device.PixelShaderResources[1] = measuredOld;

            device.PipelineState = factory[(int)(Flags.MEASURE_ADAPT)];

            device.Draw(3, 0);


            //
            //	Tonemap and compose :
            //
            device.SetTargets(null, target);

            device.PixelShaderResources[0] = hdrImage;                 // averageLum;
            device.PixelShaderResources[1] = measuredNew;              // averageLum;
            device.PixelShaderResources[2] = bloom0;                   // averageLum;
            device.PixelShaderResources[3] = Game.GetService <SpriteBatch>().TextureWhite;
            device.PixelShaderSamplers[0]  = SamplerState.LinearClamp;

            Flags op = Flags.LINEAR;

            if (Config.TonemappingOperator == TonemappingOperator.Filmic)
            {
                op = Flags.FILMIC;
            }
            if (Config.TonemappingOperator == TonemappingOperator.Linear)
            {
                op = Flags.LINEAR;
            }
            if (Config.TonemappingOperator == TonemappingOperator.Reinhard)
            {
                op = Flags.REINHARD;
            }

            device.PipelineState = factory[(int)(Flags.TONEMAPPING | op)];

            device.Draw(3, 0);

            device.ResetStates();


            //	swap luminanice buffers :
            Misc.Swap(ref measuredNew, ref measuredOld);
        }
Exemple #25
0
        /// <summary>
        ///
        /// </summary>
        internal void Render(RenderTargetSurface colorBuffer, DepthStencilSurface depthBuffer, Camera camera)
        {
            DrawTracers();

            if (!vertexDataAccum.Any())
            {
                return;
            }

            if (Game.RenderSystem.SkipDebugRendering)
            {
                vertexDataAccum.Clear();
                return;
            }

            var dev = Game.GraphicsDevice;

            dev.ResetStates();

            dev.SetTargets(depthBuffer, colorBuffer);


            var a = camera.GetProjectionMatrix(StereoEye.Mono).M11;
            var b = camera.GetProjectionMatrix(StereoEye.Mono).M22;
            var w = (float)colorBuffer.Width;
            var h = (float)colorBuffer.Height;

            constData.View         = camera.GetViewMatrix(StereoEye.Mono);
            constData.Projection   = camera.GetProjectionMatrix(StereoEye.Mono);
            constData.ViewPosition = camera.GetCameraPosition4(StereoEye.Mono);
            constData.PixelSize    = new Vector4(1 / w / a, 1 / b / h, 1 / w, 1 / h);
            constBuffer.SetData(constData);

            dev.SetupVertexInput(vertexBuffer, null);
            dev.VertexShaderConstants[0]   = constBuffer;
            dev.PixelShaderConstants[0]    = constBuffer;
            dev.GeometryShaderConstants[0] = constBuffer;

            var flags = new[] { RenderFlags.SOLID, RenderFlags.GHOST };


            foreach (var flag in flags)
            {
                dev.PipelineState = factory[(int)flag];

                int numDPs = MathUtil.IntDivUp(vertexDataAccum.Count, vertexBufferSize);

                for (int i = 0; i < numDPs; i++)
                {
                    int numVerts = i < numDPs - 1 ? vertexBufferSize : vertexDataAccum.Count % vertexBufferSize;

                    if (numVerts == 0)
                    {
                        break;
                    }

                    vertexDataAccum.CopyTo(i * vertexBufferSize, vertexArray, 0, numVerts);

                    vertexBuffer.SetData(vertexArray, 0, numVerts);

                    dev.Draw(numVerts, 0);
                }
            }

            vertexDataAccum.Clear();
        }