/// <summary>
        /// Dispose resources
        /// </summary>
        /// <param name="disposing">Free managed resources</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                this.lightGeometryVertexBuffer?.Dispose();
                this.lightGeometryVertexBuffer = null;
                this.lightGeometryIndexBuffer?.Dispose();
                this.lightGeometryIndexBuffer = null;

                this.globalLightInputLayout?.Dispose();
                this.globalLightInputLayout = null;
                this.pointLightInputLayout?.Dispose();
                this.pointLightInputLayout = null;
                this.spotLightInputLayout?.Dispose();
                this.spotLightInputLayout = null;
                this.combineLightsInputLayout?.Dispose();
                this.combineLightsInputLayout = null;

                this.rasterizerStencilPass?.Dispose();
                this.rasterizerStencilPass = null;
                this.rasterizerLightingPass?.Dispose();
                this.rasterizerLightingPass = null;
                this.depthStencilVolumeMarking?.Dispose();
                this.depthStencilVolumeMarking = null;
                this.depthStencilVolumeDrawing?.Dispose();
                this.depthStencilVolumeDrawing = null;
            }
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="graphics">Graphics</param>
        public SceneRendererDeferredLights(Graphics graphics)
        {
            this.Graphics = graphics;

            this.globalLightInputLayout   = graphics.CreateInputLayout(DrawerPool.EffectDeferredComposer.DeferredDirectionalLight.GetSignature(), VertexPosition.Input(BufferSlot));
            this.pointLightInputLayout    = graphics.CreateInputLayout(DrawerPool.EffectDeferredComposer.DeferredPointLight.GetSignature(), VertexPosition.Input(BufferSlot));
            this.spotLightInputLayout     = graphics.CreateInputLayout(DrawerPool.EffectDeferredComposer.DeferredSpotLight.GetSignature(), VertexPosition.Input(BufferSlot));
            this.combineLightsInputLayout = graphics.CreateInputLayout(DrawerPool.EffectDeferredComposer.DeferredCombineLights.GetSignature(), VertexPosition.Input(BufferSlot));

            //Stencil pass rasterizer state
            this.rasterizerStencilPass = EngineRasterizerState.StencilPass(graphics);

            //Counter clockwise cull rasterizer state
            this.rasterizerLightingPass = EngineRasterizerState.LightingPass(graphics);

            //Depth-stencil state for volume marking (Value != 0 if object is inside of the current drawing volume)
            this.depthStencilVolumeMarking = EngineDepthStencilState.VolumeMarking(graphics);

            //Depth-stencil state for volume drawing (Process pixels if stencil value != stencil reference)
            this.depthStencilVolumeDrawing = EngineDepthStencilState.VolumeDrawing(graphics);
        }