static unsafe void RenderThread(Sample sample) { // initialize the renderer Bgfx.Init(RendererBackend.OpenGL, callbackHandler: new CallbackHandler()); Bgfx.Reset(sample.WindowWidth, sample.WindowHeight, ResetFlags.MSAA16x | ResetFlags.Capture); // enable debug text Bgfx.SetDebugFeatures(DebugFeatures.DisplayText); // set view 0 clear state Bgfx.SetViewClear(0, ClearTargets.Color | ClearTargets.Depth, 0x303030ff); Bgfx.SetViewRect(0, 0, 0, sample.WindowWidth, sample.WindowHeight); // create vertex and index buffers var vbh = Cube.CreateVertexBuffer(); var ibh = Cube.CreateIndexBuffer(); // load shaders var program = ResourceLoader.LoadProgram("vs_callback", "fs_callback"); // 5 seconds of 60 Hz video var time = 0.0f; for (int frame = 0; frame < 300; frame++) { // write some debug text Bgfx.DebugTextClear(); Bgfx.DebugTextWrite(0, 1, DebugColor.White, DebugColor.Blue, "SharpBgfx/Samples/07-Callback"); Bgfx.DebugTextWrite(0, 2, DebugColor.White, DebugColor.Cyan, "Description: Implementing application specific callbacks for taking screen shots,"); Bgfx.DebugTextWrite(13, 3, DebugColor.White, DebugColor.Cyan, "caching OpenGL binary shaders, and video capture."); Bgfx.DebugTextWrite(0, 4, DebugColor.White, DebugColor.Cyan, "Frame: {0}", frame); // view transforms var viewMatrix = Matrix4x4.CreateLookAt(new Vector3(0.0f, 0.0f, 35.0f), Vector3.Zero, Vector3.UnitY); var projMatrix = Matrix4x4.CreatePerspectiveFieldOfView((float)Math.PI / 3, (float)sample.WindowWidth / sample.WindowHeight, 0.1f, 100.0f); Bgfx.SetViewTransform(0, &viewMatrix.M11, &projMatrix.M11); // fixed frame rate time += 1.0f / 60.0f; // submit 11x11 cubes for (int y = 0; y < 11; y++) { for (int x = 0; x < 11 - y; x++) { // model matrix var transform = Matrix4x4.CreateFromYawPitchRoll(time + x * 0.21f, time + y * 0.37f, 0.0f); transform.M41 = -15.0f + x * 3.0f; transform.M42 = -15.0f + y * 3.0f; transform.M43 = 0.0f; Bgfx.SetTransform(&transform.M11); // set pipeline states Bgfx.SetVertexBuffer(vbh); Bgfx.SetIndexBuffer(ibh); Bgfx.SetRenderState(RenderState.Default); // submit primitives Bgfx.Submit(0, program); } } // take a screenshot at frame 150 if (frame == 150) { Bgfx.SaveScreenShot("frame150"); } // advance to next frame Bgfx.Frame(); } // clean up ibh.Dispose(); vbh.Dispose(); program.Dispose(); Bgfx.Shutdown(); }