Intermediate Graphics Library (IGL) is a cross-platform library that commands the GPU. It encapsulates common GPU functionality with a low-level cross-platform interface. IGL is designed to support multiple backends implemented on top of various graphics APIs (e.g. OpenGL, Metal and Vulkan) with a common interface.
There are a lot of good options for abstracting GPU API's; each making different trade-offs. We designed IGL around the following priorities:
- Low-level, forward-looking API. IGL embraces modern abstractions (command buffers, state containers, bindless, etc) and is designed to give more control than OpenGL's state machine API. As a result, IGL can have leaner backends for modern API's (e.g. Metal, Vulkan).
- Minimal overhead for C++. IGL supports new or existing native rendering code without overhead of language interop or the need for other language runtimes.
- Reach + scale in production. IGL has been globally battle-tested for broad device reliability (especially the long-tail of Android devices as well as Quest 2/3/Pro compatibility for OpenGL/Vulkan) and performance-tuned on our apps.
- Metal 2+
- OpenGL 2.x (requires GL_ARB_framebuffer_object)
- OpenGL 3.1+
- OpenGL ES 2.0+
- Vulkan 1.2
- DirectX 12
- WebGPU
- WebGL 2.0
OpenGL ES, DirectX 12, WebGPU and WebGL are opt-in: IGL_WITH_OPENGLES, IGL_WITH_D3D12,
IGL_WITH_WEBGPU and IGL_WITH_WEBGL default to OFF.
- Android
- iOS
- Linux
- macOS
- Windows
- WebAssembly
| Windows | Linux | macOS | iOS | Android | |
|---|---|---|---|---|---|
| Vulkan 1.2 | ✔️ | ✔️ | ✔️ (MoltenVK) | ✖️ | ✔️ (Quest 2/3/Pro) |
| OpenGL ES 2.0 - 3.0 | ✔️ (Angle) | ✔️ (Angle) | ✖️ | ✔️ | ✔️ |
| OpenGL ES 3.1 - 3.2 | ✔️ (Angle) | ✔️ (Angle) | ✖️ | ✖️ | ✔️ |
| OpenGL 3.1 - 4.6 | ✔️ | ✔️ | ✔️ | ✖️ | ✖️ |
| Metal 2 | ✖️ | ✖️ | ✔️ | ✔️ | ✖️ |
| DirectX 12 | ✔️ | ✖️ | ✖️ | ✖️ | ✖️ |
WebGPU is not in the table because it is not tied to one native platform: igl::webgpu runs on
Dawn natively (Metal on macOS and iOS, Vulkan on Linux) and
in the browser through Emscripten's emdawnwebgpu. Win32 and Android surfaces are not covered yet.
Shaders are WGSL. See src/igl/webgpu/ROADMAP.md for the current
state.
Shaders can be written in GLSL, MSL, HLSL or SparkSL, and in Slang.
A Slang shader is written once and compiled ahead of time to SPIR-V, MSL, HLSL, WGSL and GLSL, so
the same source runs on every backend. The generated C++ headers are checked in, so building IGL
never runs slangc.
See tools/slang/README.md for how programs are declared and regenerated, and shell/renderSessions/slang/README.md for the two render sessions written entirely in Slang.
Before building, run the deployment scripts:
python3 deploy_content.py
python3 deploy_deps.py
These scripts download external third-party dependencies. Please check Dependencies for the full list.
- Windows
cd build
cmake .. -G "Visual Studio 17 2022"
- Linux
sudo apt-get install clang xorg-dev libxinerama-dev libxcursor-dev libgles2-mesa-dev libegl1-mesa-dev libglfw3-dev libglew-dev libstdc++-12-dev
cd build
cmake .. -G "Unix Makefiles"
- macOS
cd build
cmake .. -G "Xcode" -DIGL_WITH_VULKAN=OFF
- iOS
cd build
cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../third-party/deps/src/ios-cmake/ios.toolchain.cmake -DDEPLOYMENT_TARGET=13.0 -DPLATFORM=OS64
- Android
The Gradle project is located within the build/android folder.
- WebAssembly
Please install Emscripten and Ninja.
cd build
emcmake cmake .. -G Ninja
cmake --build .
Three desktop samples and over thirty render sessions ship with IGL, covering bind groups, bindless
buffers, texture views, specialization constants, mesh shaders, indirect draws, subpasses, YUV
sampling, GPU timers and the two Slang sessions. They are listed in
getting-started.md and built by default (IGL_WITH_SAMPLES).
IGL is released under the MIT license, see LICENSE.md for the full text as well as third-party library acknowledgements. SparkSL Compiler is released under the SparkSL Compiler License, see LICENSE for full text.

