Introduction
bgfx is a cross-platform rendering library that abstracts over modern and legacy graphics APIs. It allows developers to write rendering code once and target Direct3D 9/11/12, Metal, OpenGL, Vulkan, and WebGPU without changing application logic.
What bgfx Does
- Provides a single C99/C++ API that compiles to 9 different graphics backends
- Handles shader cross-compilation from a unified BGFX shader language
- Manages GPU resource lifetimes, state sorting, and draw call batching
- Ships debug tools including real-time graphics debugger and profiler
- Supports compute shaders, instancing, occlusion queries, and multi-threaded submission
Architecture Overview
bgfx uses a submit-and-forget rendering model. The application thread records draw calls into a frame buffer which is swapped with the render thread each frame. The render thread sorts by state to minimize GPU pipeline changes, then dispatches to the platform-specific backend. This two-thread design keeps the API lock-free and predictable.
Self-Hosting & Configuration
- Build with GENie (bundled) or CMake; supports MSVC, GCC, Clang, and Emscripten
- Include bx (base library) and bimg (image processing) as sibling directories
- Select backend at runtime or compile-time via renderer type enum
- Shader compilation uses the bundled shaderc tool targeting GLSL, HLSL, MSL, or SPIR-V
- Integrates with any windowing library (SDL, GLFW, native) via platform data struct
Key Features
- Minimal API surface: fewer than 100 functions cover the entire rendering pipeline
- Frame-based resource management eliminates manual fence tracking
- Texture and buffer updates are safe from any thread
- Built-in debug text overlay and geometry rendering for rapid prototyping
- Used in production by commercial game engines and tools
Comparison with Similar Tools
- sokol_gfx — even smaller single-header approach; bgfx offers more backends and tooling
- LLGL — C++ focused multi-backend; bgfx has broader platform coverage and C API
- Diligent Engine — higher-level with scene graph; bgfx stays closer to GPU metal
- wgpu — Rust-first WebGPU implementation; bgfx is C/C++ and predates WebGPU
- Raw Vulkan/D3D12 — maximum control but requires per-platform code; bgfx abstracts this
FAQ
Q: What games or engines use bgfx? A: Notably used by the Torque3D engine, the MAME arcade emulator, and several commercial studios for cross-platform shipping.
Q: Can I mix bgfx with an existing engine? A: Yes. bgfx does not own the window or main loop; it only needs a native window handle to initialize.
Q: Does bgfx support ray tracing? A: Not currently. It focuses on rasterization pipelines across the widest range of hardware.
Q: How does shader authoring work? A: Write shaders in a GLSL-like dialect with bgfx macros, then compile with shaderc to target each backend.