public void DebugRenderShadowMap(ShadowMap shadowMap)
        {
            PrepareRender(depthDebugShader);

            depthDebugShader.LoadBool("linearize", false);
            //depthDebugShader.LoadFloat("nearPlane", 10);
            //depthDebugShader.LoadFloat("farPlane", 4000);

            // Bind the FBO texture
            GL.ActiveTexture(TextureUnit.Texture0);
            shadowMap.BindTex();
            // Set transformation matrix
            depthDebugShader.LoadMatrix4("transformationMatrix",
                                         Maths.CreateTransformationMatrix(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f)));
            // Draw
            GL.DrawArrays(BeginMode.TriangleStrip, 0, 4);

            // Ubind the FBO texture
            GL.BindTexture(TextureTarget.Texture2D, 0);
            EndRender(depthDebugShader);
        }
        void RenderObjects()
        {
            // Enable global wireframe if needed
            if (Renderer.GlobalWireframe)
            {
                StateManager.EnableWireframe();
            }

            // Ensure back-face culling is enabled
            StateManager.Enable(EnableCap.CullFace);
            StateManager.Enable(EnableCap.DepthTest);
            StateManager.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);

            forwardShader.Start();
            forwardShader.LoadColor4("colorOverlay", Color.White);
            forwardShader.LoadFloat("entityLighting", 1f);

            // Load global shader variables
            Camera camera = Camera.Active;

            forwardShader.LoadBool("fogEnabled", Renderer.FogEnabled);
            if (Renderer.FogEnabled)
            {
                forwardShader.LoadInt("fogQuality", (int)GFXSettings.FogQuality);
                forwardShader.LoadFloat("fogDensity", Renderer.FogDensity);
                forwardShader.LoadFloat("fogGradient", Renderer.FogGradient);
                forwardShader.LoadFloat("fogMin", Renderer.FogMin);
                forwardShader.LoadFloat("fogMax", Renderer.FogMax);

                GL.ActiveTexture(TextureUnit.Texture1);
                if (GFXSettings.FogQuality == FogQuality.High)
                {
                    skyRenderTarg.Texture.Bind();
                }
                else if (GFXSettings.FogQuality == FogQuality.Medium)
                {
                    Renderer.Sky.skyMap.Bind();
                    forwardShader.LoadFloat("skyMapOffset", Renderer.Sky.skyMapOffset);
                }
                else
                {
                    forwardShader.LoadColor3("fogColor", Renderer.FogColor);
                }
            }
            forwardShader.LoadLights(Renderer.Lights);
            forwardShader.LoadMatrix4("projectionMatrix", camera.ProjectionMatrix);
            forwardShader.LoadMatrix4("viewMatrix", camera.ViewMatrix);
            forwardShader.LoadVector3("cameraPosition", camera.Position);
            forwardShader.LoadFloat("ambientIntensity", Renderer.AmbientIntensity);
            forwardShader.LoadBool("renderShadows", GFXSettings.RenderShadows);
            forwardShader.LoadFloat("lightFalloff", Renderer.LightFalloff);

            if (GFXSettings.RenderShadows)
            {
                forwardShader.LoadMatrix4("lightSpaceMatrix", shadowCamera.LightSpaceMatrix);
                forwardShader.LoadInt("pcfSamples", GFXSettings.ShadowPCFSamples);
                forwardShader.LoadFloat("shadowTexelMultiplier", shadow_texelMultiplier);
                forwardShader.LoadFloat("shadowBias", Renderer.ShadowBias);
                forwardShader.LoadFloat("shadowVisibility", Renderer.ShadowVisibility);

                GL.ActiveTexture(TextureUnit.Texture0);
                shadowMap.BindTex();
            }

            // Render normal geometry
            foreach (Renderer3D renderer in Renderer.Renderer3Ds.Values)
            {
                renderer.Prepare();
                renderer.Render(forwardShader, RenderPass.Normal, false);
            }

            shadowMap.UnbindTex();

            // Render front geometry
            if (GFXSettings.RenderShadows)
            {
                GL.ActiveTexture(TextureUnit.Texture0);
                shadowMap.BindTex();
            }

            GL.Clear(ClearBufferMask.DepthBufferBit);
            foreach (Renderer3D renderer in Renderer.Renderer3Ds.Values)
            {
                renderer.Prepare();
                renderer.Render(forwardShader, RenderPass.Normal, true);
            }

            forwardShader.Stop();
            shadowMap.UnbindTex();

            // Reset wireframe
            StateManager.DisableWireframe(true);
        }