void Update()
        {
            System.Diagnostics.Debug.WriteLine("Draw..");
            renderer.Begin();
            renderer.Clear();

            // render normal triangle
            renderer.UseShader(shaderProgram);
            renderer.UseVertexBuffer(vb1);
            renderer.DrawVertexBuffer(PrimitiveType.Triangles, 0, 3);

            // render textured triangle
            renderer.UseShader(shaderProgramTextured);
            renderer.UseVertexBuffer(vb2.VertexBuffer);
            //renderer.UseTexture(brickTexture); // Either use only one texture
            renderer.UseTextures(new ITexture2D[] { brickTexture, mossTexture }); // or multiple textures
            shaderProgramTextured.SetUniform(sampler1, 0);                        // the order of the textures is determined by setting the uniform to the right index of the texture
            shaderProgramTextured.SetUniform(sampler2, 1);
            renderer.DrawVertexBufferIndexed(PrimitiveType.Triangles, 6);

            // animate color
            uniformValue = uniformValue + 0.01f;
            uniformValue = uniformValue > 1.0f ? 1.0f : uniformValue;
            shaderProgramColored.SetUniform(multiplicator, uniformValue);

            // render colored triangle
            renderer.UseShader(shaderProgramColored);
            renderer.UseVertexBuffer(vb3.VertexBuffer);
            renderer.DrawVertexBufferIndexed(PrimitiveType.Triangles, 3);

            renderer.SwapBuffers();

            // end probably useless.. don't know if possible failures are due to wpf
            //renderer.End();
        }
        /// <summary>
        /// Initializes the graphics engine, the renderer, a plain shader program, vertex buffer and the viewport for a given handle.
        /// </summary>
        void InitializeSurface(IntPtr handle)
        {
            System.Diagnostics.Debug.WriteLine("Initialize Engine..");
            // initialize graphics and a renderer using a window handle
            graphics = Engine.initializeGraphics(RenderingAPI.OpenGL);
            renderer = graphics.CreateRenderer(handle);
            renderer.UseSRGBFramebuffer();

            // Create shader program by using shader sources
            ShaderSource[] sources =
            {
                new ShaderSource(ShaderType.VertexShader, Properties.Resources.VertexShader),
                new ShaderSource(ShaderType.PixelShader,  Properties.Resources.FragmentShader)
            };
            shaderProgram = RendererHelper.createShaderProgram(graphics, sources).Value;

            // create shader program manually by creating shaders
            using (IShader vertexShader = graphics.CreateShader(ShaderType.VertexShader, Properties.Resources.VertexShaderColored).Value,
                   pixelShader = graphics.CreateShader(ShaderType.PixelShader, Properties.Resources.FragmentShaderColoredUniform).Value)
            {
                shaderProgramColored = graphics.CreateShaderProgram(new IShader[] { vertexShader, pixelShader }).Value;
            }

            // create textured shader
            ShaderSource[] sourcesTexture =
            {
                new ShaderSource(ShaderType.VertexShader, Properties.Resources.VertexShaderTex),
                new ShaderSource(ShaderType.PixelShader,  Properties.Resources.FragmentShaderTex)
            };
            shaderProgramTextured = RendererHelper.createShaderProgram(graphics, sourcesTexture).Value;

            // Diffuse textures mostly srgb, normals mostly normal rgb
            // create texture
            var settings = new TextureSettings2D(TextureTargetFormat.SRGB8, TextureOriginalFormat.BGR, TextureWrapMode.MirroredRepeat,
                                                 TextureWrapMode.MirroredRepeat, TextureMinifyingFilter.Linear, TextureMagnifyingFilter.Linear, Maybe <Color <float> > .Nothing);

            brickTexture = graphics.CreateTexture2D(settings, @"Resources\BrickGroutless0095_2_XL.jpg").Value;
            mossTexture  = graphics.CreateTexture2D(settings, @"Resources\Moss0177_1_XL.jpg").Value;
            sampler1     = shaderProgramTextured.GetUniform <int>("tex");
            sampler2     = shaderProgramTextured.GetUniform <int>("tex2");

            // use uniform values for shaders
            multiplicator = shaderProgramColored.GetUniform <float>("multiplicator");
            uniformValue  = 0.0f;
            shaderProgramColored.SetUniform(multiplicator, uniformValue);

            CreateVertexBuffer1();

            CreateVertexBuffer2();

            CreateVertexBuffer3();

            renderer.ClearColor(new Color <float>(0.2f, 0.1f, 0.2f, 0.1f));
            renderer.Viewport(new Vec2 <short>(0, 0), new Size <short>((short)Width, (short)Height));
        }