public void InitTextures()
        {
            //Used for dynamic lights. Ie spot, point, lights
            //Dynamic lights are setup using the g buffer pass (normals) and depth information before material pass is drawn
            //Additional slices may be used for bloom intensity
            LightPrepassTexture = GLTexture2DArray.CreateUncompressedTexture(4, 4, 1, 1,
                                                                             PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.Float);

            LightPrepassTexture.Bind();
            LightPrepassTexture.MagFilter = TextureMagFilter.Linear;
            LightPrepassTexture.MinFilter = TextureMinFilter.Linear;
            LightPrepassTexture.UpdateParameters();
            LightPrepassTexture.Unbind();

            //Shadows
            //Channel usage:
            //Red - Dynamic shadows
            //Green - Static shadows (course, for casting onto objects)
            //Blue - Soft shading (under kart, dynamic AO?)
            //Alpha - Usually gray
            ShadowPrepassTexture = GLTexture2D.CreateWhiteTexture(4, 4);

            foreach (var lmap in Resources.LightMapFiles.Values)
            {
                lmap.Setup();
            }
        }
 public void UpdateLightPrepass(GLContext control, GLTexture gbuffer, GLTexture linearDepth)
 {
     if (LightPrepassTexture == null)
     {
         LightPrepassTexture = GLTexture2DArray.CreateUncompressedTexture(control.Width, control.Height, 1, 1,
                                                                          PixelInternalFormat.R11fG11fB10f, PixelFormat.Rgb, PixelType.UnsignedInt10F11F11FRev);
         LightPrepassTexture.Bind();
         LightPrepassTexture.MagFilter = TextureMagFilter.Linear;
         LightPrepassTexture.MinFilter = TextureMinFilter.Linear;
         LightPrepassTexture.UpdateParameters();
         LightPrepassTexture.Unbind();
     }
     LightPrepassManager.CreateLightPrepassTexture(control, gbuffer, linearDepth, LightPrepassTexture);
 }