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(); }