Exemplo n.º 1
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }
            _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights);

            ImmediateContext.Rasterizer.State = null;
            _sky.Draw(ImmediateContext, _camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            SwapChain.Present(0, PresentFlags.None);
        }
            /// <summary>
            /// Renders to back buffer.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderToBackBuffer(RenderContext context, ref RenderParameter parameter)
            {
                if (context.RenderHost.FeatureLevel >= global::SharpDX.Direct3D.FeatureLevel.Level_11_0 &&
                    context.RenderHost.RenderConfiguration.FXAALevel != FXAALevel.None)
                {
                    postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel;
                    postFXAACore.Render(context, ImmediateContext);
                }
                ImmediateContext.Flush();
                var buffer = context.RenderHost.RenderBuffer;

                if (parameter.IsMSAATexture)
                {
                    ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.BackBuffer.Resource, 0, buffer.Format);
                }
                else
                {
                    ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.BackBuffer.Resource);
                }
            }
            /// <summary>
            /// Renders the screen spaced.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="start">Start index in renderables</param>
            /// <param name="count">Number of renderables to render.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, int start, int count,
                                                   ref RenderParameter parameter)
            {
                if (count > 0)
                {
                    var hasMSAA            = context.RenderHost.RenderBuffer.ColorBufferSampleDesc.Count == 1;
                    var buffer             = context.RenderHost.RenderBuffer;
                    var depthStencilBuffer = hasMSAA ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt);
                    ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                    for (var i = start; i < start + count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                    }
                    if (!hasMSAA)
                    {
                        depthStencilBuffer.Dispose();
                    }
                }
            }
Exemplo n.º 4
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            var view = _camera.View;
            var proj = _camera.Proj;

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);

            var floorTech  = Effects.NormalMapFX.Light3TexTech;
            var activeTech = Effects.NormalMapFX.Light3Tech;

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.PosNormalTexTan;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }

            for (var p = 0; p < floorTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _grid.Draw(ImmediateContext, pass, view, proj);
            }
            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                foreach (var ammoRound in _ammo)
                {
                    ammoRound.Render(ImmediateContext, pass, view, proj);
                }
                _cylinder.Draw(ImmediateContext, pass, view, proj);
            }


            SwapChain.Present(0, PresentFlags.None);
            ImmediateContext.Rasterizer.State = null;
        }
            /// <summary>
            /// Renders the scene.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            /// <param name="testFrustum"></param>
            /// <returns>Number of node has been rendered</returns>
            public override int RenderOpaque(RenderContext context, FastList <SceneNode> renderables,
                                             ref RenderParameter parameter, bool testFrustum)
            {
                if (scheduler.ScheduleAndRun(renderables, deferredContextPool, context, parameter,
                                             testFrustum, commandList, out var counter))
                {
                    var param = parameter;

                    foreach (var command in commandList.OrderBy(x => x.Key))
                    {
                        ImmediateContext.ExecuteCommandList(command.Value, true);
                        command.Value.Dispose();
                    }
                    commandList.Clear();
                    return(counter);
                }
                else
                {
                    return(base.RenderOpaque(context, renderables, ref parameter, testFrustum));
                }
            }
Exemplo n.º 6
0
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    ImmediateContext.ClearState();
                    Util.ReleaseCom(ref _sky);
                    Util.ReleaseCom(ref _terrain);
                    Util.ReleaseCom(ref _treeModel);
                    Util.ReleaseCom(ref _instanceBuffer);

                    Effects.DestroyAll();
                    InputLayouts.DestroyAll();
                    RenderStates.DestroyAll();
                    Util.ReleaseCom(ref _txMgr);
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
Exemplo n.º 7
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(
                DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.PosNormalTexTan;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            _camera.UpdateViewMatrix();
            var viewProj = _camera.ViewProj;
            var view     = _camera.View;
            var proj     = _camera.Proj;

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);

            var activeTech = Effects.NormalMapFX.Light3TexTech;

            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _modelInstance.Draw(ImmediateContext, pass, view, proj);
                _stoneInstance.Draw(ImmediateContext, pass, view, proj);
                _dwarfInstance.Draw(ImmediateContext, pass, view, proj);
                //_towerInstance.Draw(ImmediateContext, pass, view, proj);
            }

            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_camera.Position);
            activeTech = Effects.BasicFX.Light3Tech;
            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                _towerInstance.Draw(ImmediateContext, pass, view, proj, RenderMode.Basic);
            }

            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 8
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _inputLayout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vb, VertexPC.Stride, 0));
            ImmediateContext.InputAssembler.SetIndexBuffer(_ib, Format.R32_UInt, 0);

            var wvp = _world * _view * _proj;

            _fxWVP.SetMatrix(wvp);
            for (int p = 0; p < _tech.Description.PassCount; p++)
            {
                _tech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, 0, 0);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
            /// <summary>
            /// Renders the screen spaced.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
            {
                int count = renderables.Count;

                if (count > 0)
                {
                    var  buffer     = context.RenderHost.RenderBuffer;
                    bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView;

                    var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt);
                    ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                    for (int i = 0; i < count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                    }
                    if (!useDefault)
                    {
                        depthStencilBuffer.Dispose();
                    }
                }
            }
        /// <summary>
        /// Renders the screen spaced.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderScreenSpaced(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter)
        {
            int count = renderables.Count;

            if (count > 0)
            {
                var  buffer     = context.RenderHost.RenderBuffer;
                bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView;

                var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : buffer.FullResDepthStencilPool.Get(Format.D32_Float_S8X24_UInt);
                ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                for (int i = 0; i < count; ++i)
                {
                    renderables[i].RenderCore.Render(context, ImmediateContext);
                }
                if (!useDefault)
                {
                    buffer.FullResDepthStencilPool.Put(Format.D32_Float_S8X24_UInt, depthStencilBuffer);
                }
            }
        }
Exemplo n.º 11
0
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    ImmediateContext.ClearState();
                    Util.ReleaseCom(ref _roomVB);
                    Util.ReleaseCom(ref _skullVB);
                    Util.ReleaseCom(ref _skullIB);
                    Util.ReleaseCom(ref _floorDiffuseMapSRV);
                    Util.ReleaseCom(ref _wallDiffuseMapSRV);
                    Util.ReleaseCom(ref _mirrorDiffuseMapSRV);

                    Effects.DestroyAll();
                    InputLayouts.DestroyAll();
                    RenderStates.DestroyAll();
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
Exemplo n.º 12
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.DarkGray);
            ImmediateContext.ClearDepthStencilView(DepthStencilView,
                                                   DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _inputLayout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            var wvp = _world * _view * _proj;

            _fxWVP.SetMatrix(wvp);

            // Lighting
            var array = Util.GetArray(_ambientLight);

            _fxAmbientLight.SetRawValue(
                new DataStream(array, false, false), Marshal.SizeOf(_ambientLight)
                );
            array = Util.GetArray(_spotLight);
            _fxSpotLight.SetRawValue(
                new DataStream(array, false, false), Marshal.SizeOf(_spotLight)
                );
            _fxEyePosW.Set(_eyePosW);

            ImmediateContext.InputAssembler.SetVertexBuffers(0,
                                                             new VertexBufferBinding(_cubeVB, VertexPMN.Stride, 0));
            ImmediateContext.InputAssembler.SetIndexBuffer(_cubeIB, Format.R32_UInt, 0);

            for (int p = 0; p < _tech.Description.PassCount; p++)
            {
                _tech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(36, 0, 0);
            }

            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 13
0
        private void DrawScreenQuad()
        {
            var       stride = Basic32.Stride;
            const int offset = 0;

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_screenQuadVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_screenQuadIB, Format.R32_UInt, 0);

            var world = new Matrix {
                M11 = 0.5f, M22 = 0.5f, M33 = 1.0f, M41 = 0.5f, M42 = -0.5f, M44 = 1.0f
            };
            var tech = Effects.DebugTexFX.ViewRedTech;

            for (var p = 0; p < tech.Description.PassCount; p++)
            {
                Effects.DebugTexFX.SetWorldViewProj(world);
                Effects.DebugTexFX.SetTexture(_sMap.DepthMapSRV);
                tech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(6, 0, 0);
            }
        }
Exemplo n.º 14
0
        private void DrawSkull(EffectTechnique activeSkullTech, Matrix viewProj)
        {
            // Draw skull
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var pass = activeSkullTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var world = _skullWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);

                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
        }
Exemplo n.º 15
0
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    ImmediateContext.ClearState();
                    Util.ReleaseCom(ref _shapesVB);
                    Util.ReleaseCom(ref _shapesIB);
                    Util.ReleaseCom(ref _skullVB);
                    Util.ReleaseCom(ref _skullIB);

                    Util.ReleaseCom(ref _floorTexSRV);
                    Util.ReleaseCom(ref _stoneTexSRV);
                    Util.ReleaseCom(ref _brickTexSRV);

                    Effects.DestroyAll();
                    InputLayouts.DestroyAll();
                }
                _disposed = true;
            }
            base.Dispose(disposing);
        }
Exemplo n.º 16
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            var viewProj = _view * _proj;

            _fx.SetDirLights(_dirLights);
            _fx.SetEyePosW(_eyePosW);

            var activeTech = _fx.Light2TexTech;

            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_boxVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0);

                var world = _boxWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                _fx.SetWorld(world);
                _fx.SetWorldInvTranspose(wit);
                _fx.SetWorldViewProj(wvp);
                _fx.SetTexTransform(_texTransform);
                _fx.SetMaterial(_boxMat);
                _fx.SetDiffuseMap(_diffuseMapSRV);

                activeTech.GetPassByIndex(p).Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
        /// <summary>
        /// Renders to ping pong buffer.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderToPingPongBuffer(RenderContext context, ref RenderParameter parameter)
        {
            var buffer = context.RenderHost.RenderBuffer;

            buffer.FullResPPBuffer.Initialize();
            if (context.RenderHost.FeatureLevel < global::SharpDX.Direct3D.FeatureLevel.Level_11_0 ||
                context.RenderHost.RenderConfiguration.FXAALevel == FXAALevel.None || parameter.IsMSAATexture)
            {
                if (parameter.IsMSAATexture)
                {
                    ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.FullResPPBuffer.CurrentTexture, 0, buffer.Format);
                }
                else
                {
                    ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture);
                }
            }
            else
            {
                ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture);
                postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel;
                postFXAACore.Render(context, ImmediateContext);
            }
        }
Exemplo n.º 18
0
        public override void DrawScene()
        {
            Effects.BasicFX.SetShadowMap(null);
            Effects.NormalMapFX.SetShadowMap(null);

            _sMap.BindDsvAndSetNullRenderTarget(ImmediateContext);

            DrawSceneToShadowMap();

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            var viewProj = _camera.ViewProj;
            var view     = _camera.View;
            var proj     = _camera.Proj;

            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_camera.Position);
            Effects.BasicFX.SetCubeMap(_sky.CubeMapSRV);
            Effects.BasicFX.SetShadowMap(_sMap.DepthMapSRV);

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);
            Effects.NormalMapFX.SetCubeMap(_sky.CubeMapSRV);
            Effects.NormalMapFX.SetShadowMap(_sMap.DepthMapSRV);

            var activeTech       = Effects.NormalMapFX.Light3TexTech;
            var activeSphereTech = Effects.BasicFX.Light3ReflectTech;
            var activeSkullTech  = Effects.BasicFX.Light3ReflectTech;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan;

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }
            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                // draw grid
                var pass = activeTech.GetPassByIndex(p);
                _grid.ShadowTransform = _shadowTransform;
                _grid.Draw(ImmediateContext, pass, view, proj);
                // draw box
                _box.ShadowTransform = _shadowTransform;
                _box.Draw(ImmediateContext, pass, view, proj);

                // draw columns
                foreach (var cylinder in _cylinders)
                {
                    cylinder.ShadowTransform = _shadowTransform;
                    cylinder.Draw(ImmediateContext, pass, view, proj);
                }
            }
            ImmediateContext.HullShader.Set(null);
            ImmediateContext.DomainShader.Set(null);
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            for (var p = 0; p < activeSphereTech.Description.PassCount; p++)
            {
                var pass = activeSphereTech.GetPassByIndex(p);

                foreach (var sphere in _spheres)
                {
                    sphere.ShadowTransform = _shadowTransform;
                    sphere.Draw(ImmediateContext, pass, view, proj, RenderMode.Basic);
                }
            }
            var       stride = Basic32.Stride;
            const int offset = 0;

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

            for (var p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var world = _skullWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetShadowTransform(world * _shadowTransform);
                Effects.BasicFX.SetMaterial(_skullMat);

                activeSkullTech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            DrawScreenQuad();

            _sky.Draw(ImmediateContext, _camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 19
0
        /// <summary>
        /// Initializes a new instance of the <see cref="GlxDisplay" /> class.
        /// </summary>
        /// <param name="x11">The X11.</param>
        /// <exception cref="OpenGlException">Unable to choose FBConfig
        /// or
        /// Unable to get visual info from FBConfig
        /// or
        /// GL version string is null, aborting
        /// or
        /// GL renderer string is null, aborting
        /// or
        /// Renderer '{GlInterface.Renderer}' is blacklisted by '{item}'</exception>
        public GlxDisplay(X11Info x11)
        {
            _x11 = x11;

            var baseAttribs = new[]
            {
                GLX_X_RENDERABLE, 1,
                GLX_RENDER_TYPE, GLX_RGBA_BIT,
                GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT | GLX_PBUFFER_BIT,
                GLX_DOUBLEBUFFER, 1,
                GLX_RED_SIZE, 8,
                GLX_GREEN_SIZE, 8,
                GLX_BLUE_SIZE, 8,
                GLX_ALPHA_SIZE, 8,
                GLX_DEPTH_SIZE, 1,
                GLX_STENCIL_SIZE, 8,
            };

            foreach (var attribs in new[]
            {
                //baseAttribs.Concat(multiattribs),
                baseAttribs,
            })
            {
                var ptr = Glx.ChooseFBConfig(_x11.Display, x11.DefaultScreen,
                                             attribs, out var count);
                for (var c = 0; c < count; c++)
                {
                    var visual = Glx.GetVisualFromFBConfig(_x11.Display, ptr[c]);
                    // We prefer 32 bit visuals
                    if (_fbconfig == IntPtr.Zero || visual->depth == 32)
                    {
                        _fbconfig  = ptr[c];
                        VisualInfo = visual;
                        if (visual->depth == 32)
                        {
                            break;
                        }
                    }
                }

                if (_fbconfig != IntPtr.Zero)
                {
                    break;
                }
            }

            if (_fbconfig == IntPtr.Zero)
            {
                throw new OpenGlException("Unable to choose FBConfig");
            }

            if (VisualInfo == null)
            {
                throw new OpenGlException("Unable to get visual info from FBConfig");
            }
            if (Glx.GetFBConfigAttrib(_x11.Display, _fbconfig, GLX_SAMPLES, out var samples) == 0)
            {
                SampleCount = samples;
            }
            if (Glx.GetFBConfigAttrib(_x11.Display, _fbconfig, GLX_STENCIL_SIZE, out var stencil) == 0)
            {
                StencilSize = stencil;
            }

            var pbuffers = Enumerable.Range(0, 2).Select(_ => Glx.CreatePbuffer(_x11.Display, _fbconfig, new[]
            {
                GLX_PBUFFER_WIDTH, 1, GLX_PBUFFER_HEIGHT, 1, 0
            })).ToList();

            XLib.XFlush(_x11.Display);

            ImmediateContext = CreateContext(pbuffers[0], null);
            DeferredContext  = CreateContext(pbuffers[1], ImmediateContext);
            ImmediateContext.MakeCurrent();
            var err = Glx.GetError();

            GlInterface = new GlInterface(GlxInterface.SafeGetProcAddress);
            if (GlInterface.Version == null)
            {
                throw new OpenGlException("GL version string is null, aborting");
            }
            if (GlInterface.Renderer == null)
            {
                throw new OpenGlException("GL renderer string is null, aborting");
            }

            if (Environment.GetEnvironmentVariable("AVALONIA_GLX_IGNORE_RENDERER_BLACKLIST") != "1")
            {
                var blacklist = AvaloniaLocator.Current.GetService <X11PlatformOptions>()
                                ?.GlxRendererBlacklist;
                if (blacklist != null)
                {
                    foreach (var item in blacklist)
                    {
                        if (GlInterface.Renderer.Contains(item))
                        {
                            throw new OpenGlException($"Renderer '{GlInterface.Renderer}' is blacklisted by '{item}'");
                        }
                    }
                }
            }
        }
Exemplo n.º 20
0
        public override void DrawScene()
        {
            var start = Stopwatch.GetTimestamp();

            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(
                DepthStencilView,
                DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil,
                1.0f,
                0
                );

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.InstancedBasic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            var stride = new[] { Basic32.Stride, Marshal.SizeOf(typeof(InstancedData)) };
            var offset = new[] { 0, 0 };

            var viewProj = _cam.ViewProj;

            Effects.InstancedBasicFX.SetDirLights(_dirLights);
            Effects.InstancedBasicFX.SetEyePosW(_cam.Position);
            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_cam.Position);
            var activeTech = _instancing ? Effects.InstancedBasicFX.Light3Tech : Effects.BasicFX.Light3Tech;


            if (_skullsOrBoxes)
            {
                for (int p = 0; p < activeTech.Description.PassCount; p++)
                {
                    if (_instancing)
                    {
                        ImmediateContext.InputAssembler.SetVertexBuffers(
                            0,
                            new VertexBufferBinding(_skullVB, stride[0], offset[0]),
                            new VertexBufferBinding(_instanceBuffer, stride[1], offset[1])
                            );
                        ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                        Effects.InstancedBasicFX.SetViewProj(viewProj);
                        Effects.InstancedBasicFX.SetMaterial(_skullMat);

                        activeTech.GetPassByIndex(p).Apply(ImmediateContext);
                        ImmediateContext.DrawIndexedInstanced(_skullIndexCount, _visibleObjectCount, 0, 0, 0);
                    }
                    else
                    {
                        ImmediateContext.InputAssembler.SetVertexBuffers(
                            0,
                            new VertexBufferBinding(_skullVB, stride[0], offset[0])
                            );
                        ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);
                        Effects.BasicFX.SetMaterial(_skullMat);
                        foreach (var data in _instancedData)
                        {
                            var world = data.World;
                            var wit   = MathF.InverseTranspose(world);
                            var wvp   = world * _cam.ViewProj;
                            Effects.BasicFX.SetWorld(world);
                            Effects.BasicFX.SetWorldInvTranspose(wit);
                            Effects.BasicFX.SetWorldViewProj(wvp);
                            activeTech.GetPassByIndex(p).Apply(ImmediateContext);
                            ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
                        }
                    }
                }
            }
            else
            {
                for (int p = 0; p < activeTech.Description.PassCount; p++)
                {
                    if (_instancing)
                    {
                        ImmediateContext.InputAssembler.SetVertexBuffers(
                            0,
                            new VertexBufferBinding(_boxVB, stride[0], offset[0]),
                            new VertexBufferBinding(_instanceBuffer, stride[1], offset[1])
                            );
                        ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0);

                        Effects.InstancedBasicFX.SetViewProj(viewProj);
                        Effects.InstancedBasicFX.SetMaterial(_skullMat);

                        activeTech.GetPassByIndex(p).Apply(ImmediateContext);
                        ImmediateContext.DrawIndexedInstanced(36, _visibleObjectCount, 0, 0, 0);
                    }
                    else
                    {
                        ImmediateContext.InputAssembler.SetVertexBuffers(
                            0,
                            new VertexBufferBinding(_boxVB, stride[0], offset[0])
                            );
                        ImmediateContext.InputAssembler.SetIndexBuffer(_boxIB, Format.R32_UInt, 0);
                        Effects.BasicFX.SetMaterial(_skullMat);
                        foreach (var data in _instancedData)
                        {
                            var world = data.World;
                            var wit   = MathF.InverseTranspose(world);
                            var wvp   = world * _cam.ViewProj;
                            Effects.BasicFX.SetWorld(world);
                            Effects.BasicFX.SetWorldInvTranspose(wit);
                            Effects.BasicFX.SetWorldViewProj(wvp);
                            activeTech.GetPassByIndex(p).Apply(ImmediateContext);
                            ImmediateContext.DrawIndexed(36, 0, 0);
                        }
                    }
                }
            }
            SwapChain.Present(0, PresentFlags.None);
            var elapsed = ((float)(Stopwatch.GetTimestamp() - start)) / Stopwatch.Frequency;

            Console.WriteLine("frame time: {0} msec", elapsed * 1000);
        }
Exemplo n.º 21
0
        public override void UpdateScene(float dt)
        {
            base.UpdateScene(dt);
            if (Util.IsKeyDown(Keys.Up))
            {
                _cam.Walk(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Down))
            {
                _cam.Walk(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Left))
            {
                _cam.Strafe(-10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.Right))
            {
                _cam.Strafe(10.0f * dt);
            }
            if (Util.IsKeyDown(Keys.D1))
            {
                _frustumCullingEnabled = true;
            }
            if (Util.IsKeyDown(Keys.D2))
            {
                _frustumCullingEnabled = false;
            }
            if (Util.IsKeyDown(Keys.U))
            {
                _instancing = false;
            }
            if (Util.IsKeyDown(Keys.I))
            {
                _instancing = true;
            }
            if (Util.IsKeyDown(Keys.B))
            {
                _skullsOrBoxes = false;
            }
            if (Util.IsKeyDown(Keys.S))
            {
                _skullsOrBoxes = true;
            }
            _cam.UpdateViewMatrix();
            _visibleObjectCount = 0;
            if (_frustumCullingEnabled)
            {
                var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None);

                foreach (var instancedData in _instancedData)
                {
                    var w   = instancedData.World;
                    var box = new BoundingBox(
                        Vector3.TransformCoordinate(_skullBox.Minimum, w),
                        Vector3.TransformCoordinate(_skullBox.Maximum, w)
                        );

                    if (_cam.Visible(box))
                    {
                        db.Data.Write(instancedData);
                        _visibleObjectCount++;
                    }
                }

                ImmediateContext.UnmapSubresource(_instanceBuffer, 0);
            }
            else
            {
                var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None);
                foreach (var instancedData in _instancedData)
                {
                    db.Data.Write(instancedData);
                    _visibleObjectCount++;
                }

                ImmediateContext.UnmapSubresource(_instanceBuffer, 0);
            }
            MainWindowCaption = String.Format("Instancing and Culling Demo    {0} objects visible out of {1}", _visibleObjectCount, _instancedData.Count);
        }
Exemplo n.º 22
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            Matrix view;
            Matrix proj;
            Matrix viewProj;

            if (_useFpsCamera)
            {
                _cam.UpdateViewMatrix();

                view     = _cam.View;
                proj     = _cam.Proj;
                viewProj = _cam.ViewProj;
                Effects.BasicFX.SetEyePosW(_cam.Position);
            }
            else
            {
                _cam2.UpdateViewMatrix();

                view     = _cam2.View;
                proj     = _cam2.Proj;
                viewProj = _cam2.ViewProj;
                Effects.BasicFX.SetEyePosW(_cam2.Position);
            }

            Effects.BasicFX.SetDirLights(_dirLights);


            var activeTexTech   = Effects.BasicFX.Light1TexTech;
            var activeSkullTech = Effects.BasicFX.Light1Tech;

            switch (_lightCount)
            {
            case 1:
                activeTexTech   = Effects.BasicFX.Light1TexTech;
                activeSkullTech = Effects.BasicFX.Light1Tech;
                break;

            case 2:
                activeTexTech   = Effects.BasicFX.Light2TexTech;
                activeSkullTech = Effects.BasicFX.Light2Tech;
                break;

            case 3:
                activeTexTech   = Effects.BasicFX.Light3TexTech;
                activeSkullTech = Effects.BasicFX.Light3Tech;
                break;
            }
            for (var p = 0; p < activeTexTech.Description.PassCount; p++)
            {
                var pass = activeTexTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

                var world             = _gridWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * view * proj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Scaling(6, 8, 1));
                Effects.BasicFX.SetMaterial(_gridMat);
                Effects.BasicFX.SetDiffuseMap(_floorTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world             = _boxWorld;
                worldInvTranspose = MathF.InverseTranspose(world);
                wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Identity);
                Effects.BasicFX.SetMaterial(_boxMat);
                Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_cylinderMat);
                    Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
                foreach (var matrix in _sphereWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_sphereMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
            }
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var pass = activeSkullTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var world             = _skullWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 23
0
        public override void DrawScene()
        {
            Effects.TerrainFX.SetSsaoMap(_whiteTex);
            Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
            Effects.TerrainFX.SetShadowTransform(_shadowTransform);
            _minimap.RenderMinimap(_dirLights);

            var viewProj = _lightView * _lightProj;

            _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj);

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView);



            ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);

            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }

            if (Util.IsKeyDown(Keys.S))
            {
                Effects.TerrainFX.SetSsaoMap(_whiteTex);
            }
            else
            {
                Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV);
            }
            Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
            Effects.TerrainFX.SetShadowTransform(_shadowTransform);

            if (!Util.IsKeyDown(Keys.A))
            {
                _terrain.Renderer.Shadows = true;
            }
            else
            {
                _terrain.Renderer.Shadows = false;
            }



            _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights);



            ImmediateContext.Rasterizer.State = null;



            _sky.Draw(ImmediateContext, _camera);


            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            DrawScreenQuad(_ssao.AmbientSRV);
            DrawScreenQuad2(_ssao.NormalDepthSRV);
            DrawScreenQuad3(_sMap.DepthMapSRV);
            _minimap.Draw(ImmediateContext);
            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 24
0
        private void DrawSkullShadow(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor)
        {
            // draw skull shadow on floor
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var pass = activeSkullTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f);
                var toMainLight = -_dirLights[0].Direction;

                var s             = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                var shadowOffsetY = Matrix.Translation(0, 0.001f, 0);

                var world = _skullWorld * s * shadowOffsetY;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                ImmediateContext.OutputMerger.BlendState      = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                ImmediateContext.OutputMerger.DepthStencilState     = RenderStates.NoDoubleBlendDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;
                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                // draw skull shadow on wall
                shadowPlane = new Plane(new Vector3(0, 0, -1), 0.0f);
                toMainLight = -_dirLights[0].Direction;

                s             = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                shadowOffsetY = Matrix.Translation(0, 0, -0.001f);

                world = _skullWorld * s * shadowOffsetY;
                wit   = MathF.InverseTranspose(world);
                wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                ImmediateContext.OutputMerger.DepthStencilState     = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;

                ImmediateContext.OutputMerger.BlendState      = null;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;
            }
        }
Exemplo n.º 25
0
        private void DrawSkullShadowReflection(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor)
        {
            // draw skull shadow
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var pass = activeSkullTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f);
                var toMainLight = -_dirLights[0].Direction;

                var s             = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                var shadowOffsetY = Matrix.Translation(0, 0.001f, 0);

                var mirrorPlane = new Plane(new Vector3(0, 0, 1), 0);
                var r           = Matrix.Reflection(mirrorPlane);

                var world = _skullWorld * s * shadowOffsetY * r;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                ImmediateContext.OutputMerger.BlendState      = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                var oldLightDirections = _dirLights.Select(l => l.Direction).ToArray();

                for (int i = 0; i < _dirLights.Length; i++)
                {
                    var l                 = _dirLights[i];
                    var lightDir          = l.Direction;
                    var reflectedLightDir = Vector3.Transform(lightDir, r);
                    _dirLights[i].Direction = new Vector3(reflectedLightDir.X, reflectedLightDir.Y, reflectedLightDir.Z);
                }
                Effects.BasicFX.SetDirLights(_dirLights);

                ImmediateContext.Rasterizer.State = RenderStates.CullClockwiseRS;

                ImmediateContext.OutputMerger.DepthStencilState     = RenderStates.NoDoubleBlendDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 1;
                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                ImmediateContext.OutputMerger.DepthStencilState     = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;

                ImmediateContext.OutputMerger.BlendState      = null;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                for (int i = 0; i < oldLightDirections.Length; i++)
                {
                    _dirLights[i].Direction = oldLightDirections[i];
                }
                Effects.BasicFX.SetDirLights(_dirLights);
            }
        }
Exemplo n.º 26
0
        public override void DrawScene()
        {
            Effects.TerrainFX.SetSsaoMap(_whiteTex);
            Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
            Effects.TerrainFX.SetShadowTransform(_shadowTransform);
            _minimap.RenderMinimap(_dirLights);

            var view     = _lightView;
            var proj     = _lightProj;
            var viewProj = view * proj;

            _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj);
            DrawSceneToShadowMap();

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView);

            ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }

            if (Util.IsKeyDown(Keys.S))
            {
                Effects.TerrainFX.SetSsaoMap(_whiteTex);
            }
            else
            {
                Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV);
            }
            if (!Util.IsKeyDown(Keys.A))
            {
                Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
                Effects.TerrainFX.SetShadowTransform(_shadowTransform);
            }
            else
            {
                Effects.TerrainFX.SetShadowMap(_whiteTex);
            }

            Effects.BasicFX.SetEyePosW(_camera.Position);
            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetSsaoMap(_whiteTex);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            for (var p = 0; p < Effects.BasicFX.Light1Tech.Description.PassCount; p++)
            {
                var pass = Effects.BasicFX.Light1Tech.GetPassByIndex(p);
                _unit.Render(ImmediateContext, pass, _camera.View, _camera.Proj);
            }

            _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights);

            ImmediateContext.Rasterizer.State = null;

            _sky.Draw(ImmediateContext, _camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            _minimap.Draw(ImmediateContext);

            FontCache.DrawStrings(
                new[] {
                "Currently: " + _unit.Position,
                "Destination: " + _unit.Destination.MapPosition
            },
                Vector2.Zero,
                Color.Yellow
                );
            FontCache.DrawString("bold", "This is bold", new Vector2(Window.ClientSize.Width - 200, 0), Color.Red);
            EndFrame();
        }
Exemplo n.º 27
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = InputLayouts.PosNormal;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            var viewProj = _view * _proj;

            _fx.SetDirLights(_dirLights);
            _fx.SetEyePosW(_eyePosW);

            var activeTech = _fx.Light1Tech;

            switch (_lightCount)
            {
            case 1:
                activeTech = _fx.Light1Tech;
                break;

            case 2:
                activeTech = _fx.Light2Tech;
                break;

            case 3:
                activeTech = _fx.Light3Tech;
                break;
            }
            for (var p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, VertexPN.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

                var world             = _gridWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * viewProj;
                _fx.SetWorld(world);
                _fx.SetWorldInvTranspose(worldInvTranspose);
                _fx.SetWorldViewProj(wvp);
                _fx.SetMaterial(_gridMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world             = _boxWorld;
                worldInvTranspose = MathF.InverseTranspose(world);
                wvp = world * viewProj;
                _fx.SetWorld(world);
                _fx.SetWorldInvTranspose(worldInvTranspose);
                _fx.SetWorldViewProj(wvp);
                _fx.SetMaterial(_boxMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    _fx.SetWorld(world);
                    _fx.SetWorldInvTranspose(worldInvTranspose);
                    _fx.SetWorldViewProj(wvp);
                    _fx.SetMaterial(_cylinderMat);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
                foreach (var matrix in _sphereWorld)
                {
                    world             = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    _fx.SetWorld(world);
                    _fx.SetWorldInvTranspose(worldInvTranspose);
                    _fx.SetWorldViewProj(wvp);
                    _fx.SetMaterial(_sphereMat);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, VertexPN.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                world             = _skullWorld;
                worldInvTranspose = MathF.InverseTranspose(world);
                wvp = world * viewProj;
                _fx.SetWorld(world);
                _fx.SetWorldInvTranspose(worldInvTranspose);
                _fx.SetWorldViewProj(wvp);
                _fx.SetMaterial(_skullMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 28
0
        private void DrawSceneToShadowMap()
        {
            try {
                var view     = _lightView;
                var proj     = _lightProj;
                var viewProj = view * proj;

                Effects.BuildShadowMapFX.SetEyePosW(_camera.Position);
                Effects.BuildShadowMapFX.SetViewProj(viewProj);

                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                var smapTech = Effects.BuildShadowMapFX.BuildShadowMapTech;

                const int offset = 0;

                ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan;

                if (Util.IsKeyDown(Keys.W))
                {
                    ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
                }

                for (var p = 0; p < smapTech.Description.PassCount; p++)
                {
                    var pass = smapTech.GetPassByIndex(p);
                    _grid.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap);

                    _box.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap);

                    foreach (var cylinder in _cylinders)
                    {
                        cylinder.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap);
                    }
                }

                ImmediateContext.HullShader.Set(null);
                ImmediateContext.DomainShader.Set(null);
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

                for (var p = 0; p < smapTech.Description.PassCount; p++)
                {
                    var pass = smapTech.GetPassByIndex(p);
                    foreach (var sphere in _spheres)
                    {
                        sphere.Draw(ImmediateContext, pass, view, proj, RenderMode.ShadowMap);
                    }
                }
                var stride = Basic32.Stride;
                ImmediateContext.Rasterizer.State = null;

                ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32;
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                for (var p = 0; p < smapTech.Description.PassCount; p++)
                {
                    var world = _skullWorld;
                    var wit   = MathF.InverseTranspose(world);
                    var wvp   = world * viewProj;

                    Effects.BuildShadowMapFX.SetWorld(world);
                    Effects.BuildShadowMapFX.SetWorldInvTranspose(wit);
                    Effects.BuildShadowMapFX.SetWorldViewProj(wvp);
                    Effects.BuildShadowMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                    smapTech.GetPassByIndex(p).Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
                }
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
Exemplo n.º 29
0
        public override void DrawScene()
        {
            base.DrawScene();

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            _camera.UpdateViewMatrix();

            var view     = _camera.View;
            var proj     = _camera.Proj;
            var viewProj = _camera.ViewProj;

            var blendFactor = new Color4(0, 0, 0, 0);

            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetEyePosW(_camera.Position);
            Effects.BasicFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.NormalMapFX.SetDirLights(_dirLights);
            Effects.NormalMapFX.SetEyePosW(_camera.Position);
            Effects.NormalMapFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.DisplacementMapFX.SetDirLights(_dirLights);
            Effects.DisplacementMapFX.SetEyePosW(_camera.Position);
            Effects.DisplacementMapFX.SetCubeMap(_sky.CubeMapSRV);

            Effects.DisplacementMapFX.SetHeightScale(0.05f);
            Effects.DisplacementMapFX.SetMaxTessDistance(1.0f);
            Effects.DisplacementMapFX.SetMinTessDistance(25.0f);
            Effects.DisplacementMapFX.SetMinTessFactor(1.0f);
            Effects.DisplacementMapFX.SetMaxTessFactor(5.0f);

            var activeTech       = Effects.DisplacementMapFX.Light3Tech;
            var activeSphereTech = Effects.BasicFX.Light3ReflectTech;
            var activeSkullTech  = Effects.BasicFX.Light3ReflectTech;

            switch (_renderOptions)
            {
            case RenderOptions.Basic:
                activeTech = Effects.BasicFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                break;

            case RenderOptions.NormalMap:
                activeTech = Effects.NormalMapFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                break;

            case RenderOptions.DisplacementMap:
                activeTech = Effects.DisplacementMapFX.Light3TexTech;
                ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.PatchListWith3ControlPoints;
                break;
            }
            var stride = PosNormalTexTan.Stride;
            var offset = 0;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.PosNormalTexTan;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }
            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                var world = _gridWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                switch (_renderOptions)
                {
                case RenderOptions.Basic:
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.BasicFX.SetMaterial(_gridMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    break;

                case RenderOptions.NormalMap:
                    Effects.NormalMapFX.SetWorld(world);
                    Effects.NormalMapFX.SetWorldInvTranspose(wit);
                    Effects.NormalMapFX.SetWorldViewProj(wvp);
                    Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.NormalMapFX.SetMaterial(_gridMat);
                    Effects.NormalMapFX.SetDiffuseMap(_stoneTexSRV);
                    Effects.NormalMapFX.SetNormalMap(_stoneNormalTexSRV);
                    break;

                case RenderOptions.DisplacementMap:
                    Effects.DisplacementMapFX.SetWorld(world);
                    Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                    Effects.DisplacementMapFX.SetViewProj(viewProj);
                    Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                    Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(8, 10, 1));
                    Effects.DisplacementMapFX.SetMaterial(_gridMat);
                    Effects.DisplacementMapFX.SetDiffuseMap(_stoneTexSRV);
                    Effects.DisplacementMapFX.SetNormalMap(_stoneNormalTexSRV);
                    break;
                }
                var pass = activeTech.GetPassByIndex(p);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world = _boxWorld;
                wit   = MathF.InverseTranspose(world);
                wvp   = world * viewProj;

                switch (_renderOptions)
                {
                case RenderOptions.Basic:
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.BasicFX.SetMaterial(_boxMat);
                    Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                    break;

                case RenderOptions.NormalMap:
                    Effects.NormalMapFX.SetWorld(world);
                    Effects.NormalMapFX.SetWorldInvTranspose(wit);
                    Effects.NormalMapFX.SetWorldViewProj(wvp);
                    Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.NormalMapFX.SetMaterial(_boxMat);
                    Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV);
                    Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV);
                    break;

                case RenderOptions.DisplacementMap:
                    Effects.DisplacementMapFX.SetWorld(world);
                    Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                    Effects.DisplacementMapFX.SetViewProj(viewProj);
                    Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                    Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(2, 1, 1));
                    Effects.DisplacementMapFX.SetMaterial(_boxMat);
                    Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV);
                    Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV);
                    break;
                }
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld)
                {
                    world = matrix;
                    wit   = MathF.InverseTranspose(world);
                    wvp   = world * viewProj;

                    switch (_renderOptions)
                    {
                    case RenderOptions.Basic:
                        Effects.BasicFX.SetWorld(world);
                        Effects.BasicFX.SetWorldInvTranspose(wit);
                        Effects.BasicFX.SetWorldViewProj(wvp);
                        Effects.BasicFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.BasicFX.SetMaterial(_cylinderMat);
                        Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                        break;

                    case RenderOptions.NormalMap:
                        Effects.NormalMapFX.SetWorld(world);
                        Effects.NormalMapFX.SetWorldInvTranspose(wit);
                        Effects.NormalMapFX.SetWorldViewProj(wvp);
                        Effects.NormalMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.NormalMapFX.SetMaterial(_cylinderMat);
                        Effects.NormalMapFX.SetDiffuseMap(_brickTexSRV);
                        Effects.NormalMapFX.SetNormalMap(_brickNormalTexSRV);
                        break;

                    case RenderOptions.DisplacementMap:
                        Effects.DisplacementMapFX.SetWorld(world);
                        Effects.DisplacementMapFX.SetWorldInvTranspose(wit);
                        Effects.DisplacementMapFX.SetViewProj(viewProj);
                        Effects.DisplacementMapFX.SetWorldViewProj(wvp);
                        Effects.DisplacementMapFX.SetTexTransform(Matrix.Scaling(1, 2, 1));
                        Effects.DisplacementMapFX.SetMaterial(_cylinderMat);
                        Effects.DisplacementMapFX.SetDiffuseMap(_brickTexSRV);
                        Effects.DisplacementMapFX.SetNormalMap(_brickNormalTexSRV);
                        break;
                    }
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
            }
            ImmediateContext.HullShader.Set(null);
            ImmediateContext.DomainShader.Set(null);
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            for (int p = 0; p < activeSphereTech.Description.PassCount; p++)
            {
                foreach (var matrix in _sphereWorld)
                {
                    var world = matrix;
                    var wit   = MathF.InverseTranspose(world);
                    var wvp   = world * viewProj;

                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_sphereMat);

                    activeSphereTech.GetPassByIndex(p).Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
            }
            stride = Basic32.Stride;
            offset = 0;

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, stride, offset));
            ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

            for (int p = 0; p < activeSkullTech.Description.PassCount; p++)
            {
                var world = _skullWorld;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);

                activeSkullTech.GetPassByIndex(p).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            _sky.Draw(ImmediateContext, _camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;

            SwapChain.Present(0, PresentFlags.None);
        }
Exemplo n.º 30
0
        public override void DrawScene()
        {
            Effects.TerrainFX.SetSsaoMap(_whiteTex);
            Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
            Effects.TerrainFX.SetShadowTransform(_shadowTransform);
            _minimap.RenderMinimap(_dirLights);



            var view     = _lightView;
            var proj     = _lightProj;
            var viewProj = view * proj;

            _terrain.Renderer.DrawToShadowMap(ImmediateContext, _sMap, viewProj);

            ImmediateContext.Rasterizer.State = null;

            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);
            ImmediateContext.Rasterizer.SetViewports(Viewport);


            _terrain.Renderer.ComputeSsao(ImmediateContext, _camera, _ssao, DepthStencilView);


            ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView);
            ImmediateContext.Rasterizer.SetViewports(Viewport);

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.Silver);

            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            if (Util.IsKeyDown(Keys.W))
            {
                ImmediateContext.Rasterizer.State = RenderStates.WireframeRS;
            }

            if (Util.IsKeyDown(Keys.S))
            {
                Effects.TerrainFX.SetSsaoMap(_whiteTex);
            }
            else
            {
                Effects.TerrainFX.SetSsaoMap(_ssao.AmbientSRV);
            }
            if (!Util.IsKeyDown(Keys.A))
            {
                Effects.TerrainFX.SetShadowMap(_sMap.DepthMapSRV);
                Effects.TerrainFX.SetShadowTransform(_shadowTransform);
            }
            else
            {
                Effects.TerrainFX.SetShadowMap(_whiteTex);
            }

            Effects.BasicFX.SetEyePosW(_camera.Position);
            Effects.BasicFX.SetDirLights(_dirLights);
            Effects.BasicFX.SetSsaoMap(_whiteTex);
            Effects.BasicFX.SetSsaoMap(_whiteTex);


            if (_showSphere)
            {
                _sphere.World = Matrix.Translation(_spherePos);
                for (var p = 0; p < Effects.BasicFX.Light1Tech.Description.PassCount; p++)
                {
                    var pass = Effects.BasicFX.Light1Tech.GetPassByIndex(p);
                    _sphere.Draw(ImmediateContext, pass, _camera.View, _camera.Proj, RenderMode.Basic);
                }
            }

            _terrain.Renderer.Draw(ImmediateContext, _camera, _dirLights);



            ImmediateContext.Rasterizer.State = null;



            _sky.Draw(ImmediateContext, _camera);


            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState     = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;


            _minimap.Draw(ImmediateContext);
            SwapChain.Present(0, PresentFlags.None);
        }