protected override void OnRenderFrame(FrameEventArgs e)
        {
            // set up viewport
            GL.Viewport(0, 0, Size.X, Size.Y);
            // clear the back buffer
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            // set up modelview and perspective matrix
            SetupPerspective();

            // set uniforms
            _program.CenterMass.Set(_centerMass);
            _program.TimeStep.Set((float)e.Time);
            _program.ModelViewProjectionMatrix.Set(ModelView * Projection);

            // set up binding of the shader variable to the buffer object
            _vao.BindAttribute(_program.InPosition, _buffers.Ping);
            _vao.BindAttribute(_program.InVelocity, _buffers.Ping, 16);

            // set target buffer for transform feedback
            // the two outputs are interleaved into the same buffer
            // so we only have to bind one of them as both binding indices are equal:
            // _program.OutPosition.Index == _program.OutVelocity.Index
            // when you choose to write into different buffers you need to bind all of them
            _feedback.BindOutput(_program.OutPosition, _buffers.Pong);

            // render the buffer and capture transform feedback outputs
            _feedback.Begin(TransformFeedbackPrimitiveType.Points);
            _vao.DrawArrays(PrimitiveType.Points, 0, _buffers.Ping.ElementCount);
            _feedback.End();

            // swap all the buffers!
            _buffers.Swap();
            SwapBuffers();
        }