private int CreateTexture(Bitmap texture, TextureUnit unit, TextureMinFilter minFilter, TextureMagFilter magFilter)
        {
            int textureId = GL.GenTexture();

            GL.ActiveTexture(unit);
            GL.BindTexture(TextureTarget.Texture2D, textureId);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)minFilter);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)magFilter);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texture.Width, texture.Height, 0,
                          PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);

            var bmpData = texture.LockBits(new Rectangle(0, 0, texture.Width, texture.Height),
                                           ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, texture.Width, texture.Height, PixelFormat.Bgra,
                             PixelType.UnsignedByte, bmpData.Scan0);

            texture.UnlockBits(bmpData);

            GL.BindTexture(TextureTarget.Texture2D, 0);

            return(textureId);
        }
        public void UseTexture(string textureName, string shader, string uniformName)
        {
            if (!_textureHandleDictionary.ContainsKey(textureName))
            {
                throw new ApplicationException("Texture has to be added before using");
            }
            GL.UseProgram(_shaderHandleDictionary[shader]);
            var textureInfo = _textureHandleDictionary[textureName];

            GL.ActiveTexture(TextureUnit.Texture0 + textureInfo.Unit);
            GL.BindTexture(TextureTarget.Texture2D, textureInfo.Handle);
            int location = GL.GetUniformLocation(_shaderHandleDictionary[shader], uniformName);

            if (location != -1)
            {
                int textureUnitIndex = textureInfo.Unit;
                GL.Uniform1(location, textureUnitIndex);
            }
        }