Filament is a real-time physically based rendering engine for Android, iOS, Linux, macOS, Windows, and WebGL. It is designed to be as small as possible and as efficient as possible on Android.
Download Filament releases to access stable builds. Filament release archives contains host-side tools that are required to generate assets.
Make sure you always use tools from the same release as the runtime library. This is particularly
important for matc
(material compiler).
If you'd rather build Filament yourself, please refer to our build manual.
Android projects can simply declare Filament libraries as Maven dependencies:
repositories {
// ...
mavenCentral()
}
dependencies {
implementation 'com.google.android.filament:filament-android:1.5.1'
}
Here are all the libraries available in the group com.google.android.filament
:
filament-android
: the Filament rendering engine itselfgltfio-android
: a glTF 2.0 loader for Filament, depends onfilament-android
gltfio-android-lite
: trimmed version ofgltfio
that does not support some glTF featuresfilament-utils-android
: KTX loading, Kotlin math, and camera utilities, depends ongltfio-android
filament-utils-lite-android
: trimmed version offilament-utils
that does not support some glTF featuresfilamat-android
: a runtime material builder/compiler. This library is large but contains a full shader compiler/validator/optimizerfilamat-android-lite
: a much smaller alternative tofilamat-android
that can only generate OpenGL shaders. It does not provide validation or optimizations
If you prefer to live on the edge, you can download a continuous build by following the following steps:
- Find the commit you're interested in.
- Click the green check mark under the commit message.
- Click on the Details link for the platform you're interested in.
- On the top right, click on the Artifacts dropdown and choose an artifact.
- Filament, an in-depth explanation of real-time physically based rendering, the graphics capabilities and implementation of Filament. This document explains the math and reasoning behind most of our decisions. This document is a good introduction to PBR for graphics programmers.
- Materials, the full reference
documentation for our material system. This document explains our different material models, how
to use the material compiler
matc
and how to write custom materials. - Material Properties, a reference sheet for the standard material model.
Here are a few sample materials rendered with Filament:
Here are a few screenshots of applications that use Filament in production:
- Native C++ API for Android, iOS, Linux, macOS and Windows
- Java/JNI API for Android, Linux, macOS and Windows
- JavaScript API
- OpenGL 4.1+ for Linux, macOS and Windows
- OpenGL ES 3.0+ for Android and iOS
- Metal for macOS and iOS
- Vulkan 1.0 for Android, Linux, macOS, and Windows
- WebGL 2.0 for all platforms
- Clustered forward renderer
- Cook-Torrance microfacet specular BRDF
- Lambertian diffuse BRDF
- HDR/linear lighting
- Metallic workflow
- Clear coat
- Anisotropic lighting
- Approximated translucent (subsurface) materials
- Cloth shading
- Normal mapping & ambient occlusion mapping
- Image-based lighting
- Physically-based camera (shutter speed, sensitivity and aperture)
- Physical light units
- Point lights, spot lights and directional light
- Spot and directional light shadows
- Contact shadows
- Screen-space ambient occlusion
- Screen-space refraction
- Global fog
- HDR bloom
- ACES-like tone-mapping
- Temporal dithering
- FXAA, MSAA and specular anti-aliasing
- Dynamic resolution (on Android and iOS)
You must create an Engine
, a Renderer
and a SwapChain
. The SwapChain
is created from a
native window pointer (an NSView
on macOS or a HWND
on Windows for instance):
Engine* engine = Engine::create();
SwapChain* swapChain = engine->createSwapChain(nativeWindow);
Renderer* renderer = engine->createRenderer();
To render a frame you must then create a View
, a Scene
and a Camera
:
Camera* camera = engine->createCamera();
View* view = engine->createView();
Scene* scene = engine->createScene();
view->setCamera(camera);
view->setScene(scene);
Renderables are added to the scene:
Entity renderable = EntityManager::get().create();
// build a quad
RenderableManager::Builder(1)
.boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }})
.material(0, materialInstance)
.geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vertexBuffer, indexBuffer, 0, 6)
.culling(false)
.build(*engine, renderable);
scene->addEntity(renderable);
The material instance is obtained from a material, itself loaded from a binary blob generated
by matc
:
Material* material = Material::Builder()
.package((void*) BAKED_MATERIAL_PACKAGE, sizeof(BAKED_MATERIAL_PACKAGE))
.build(*engine);
MaterialInstance* materialInstance = material->createInstance();
To learn more about materials and matc
, please refer to the
materials documentation.
To render, simply pass the View
to the Renderer
:
// beginFrame() returns false if we need to skip a frame
if (renderer->beginFrame(swapChain)) {
// for each View
renderer->render(view);
renderer->endFrame();
}
For complete examples of Linux, macOS and Windows Filament applications, look at the source files
in the samples/
directory. These samples are all based on samples/app/
which contains the code
that creates a native window with SDL2 and initializes the Filament engine, renderer and views.
After building Filament, you can use filament-java.jar
and its companion filament-jni
native
library to use Filament in desktop Java applications.
You must always first initialize Filament by calling Filament.init()
.
You can use Filament either with AWT or Swing, using respectively a FilamentCanvas
or a
FilamentPanel
.
Following the steps above (how to use Filament from native code), create an Engine
and a
Renderer
, but instead of calling beginFrame
and endFrame
on the renderer itself, call
these methods on FilamentCanvas
or FilamentPanel
.
See android/samples
for examples of how to use Filament on Android.
You must always first initialize Filament by calling Filament.init()
.
Rendering with Filament on Android is similar to rendering from native code (the APIs are largely
the same across languages). You can render into a Surface
by passing a Surface
to the
createSwapChain
method. This allows you to render to a SurfaceTexture
, a TextureView
or
a SurfaceView
. To make things easier we provide an Android specific API called UiHelper
in the
package com.google.android.filament.android
. All you need to do is set a render callback on the
helper and attach your SurfaceView
or TextureView
to it. You are still responsible for
creating the swap chain in the onNativeWindowChanged()
callback.
See ios/samples
for examples of using Filament on iOS.
Filament on iOS is largely the same as native rendering with C++. A CAEAGLLayer
or CAMetalLayer
is passed to the createSwapChain
method. Filament for iOS supports both OpenGL ES and Vulkan via
MoltenVK.
To get started you can use the textures and environment maps found respectively in
third_party/textures
and third_party/environments
. These assets are under CC0 license. Please
refer to their respective URL.txt
files to know more about the original authors.
Please read and follow the steps in CONTRIBUTING.md. Make sure you are familiar with the code style.
This repository not only contains the core Filament engine, but also its supporting libraries and tools.
android
: Android libraries and projectsfilamat-android
: Filament material generation library (AAR) for Androidfilament-android
: Filament library (AAR) for Androidgltfio-android
: Filament glTF loading library (AAR) for Androidsamples
: Android-specific Filament samples
art
: Source for various artworks (logos, PDF manuals, etc.)assets
: 3D assets to use with sample applicationsbuild
: CMake build scriptsdocs
: Documentationmath
: Mathematica notebooks used to explore BRDFs, equations, etc.
filament
: Filament rendering engine (minimal dependencies)ide
: Configuration files for IDEs (CLion, etc.)ios
: Sample projects for iOSjava
: Java bindings for Filament librarieslibs
: Librariesbluegl
: OpenGL bindings for macOS, Linux and Windowsbluevk
: Vulkan bindings for macOS, Linux, Windows and Androidfilabridge
: Library shared by the Filament engine and host toolsfilaflat
: Serialization/deserialization library used for materialsfilagui
: Helper library for Dear ImGuifilamat
: Material generation libraryfilameshio
: Tiny filamesh parsing library (see alsotools/filamesh
)geometry
: Mesh-related utilitiesgltfio
: Loader for glTF 2.0ibl
: IBL generation toolsimage
: Image filtering and simple transformsimageio
: Image file reading / writing, only intended for internal usematdbg
: DebugServer for inspecting shaders at run-time (debug builds only)math
: Math libraryutils
: Utility library (threads, memory, data structures, etc.)
samples
: Sample desktop applicationsshaders
: Shaders used byfilamat
andmatc
third_party
: External libraries and assetsenvironments
: Environment maps under CC0 license that can be used withcmgen
models
: Models under permissive licensestextures
: Textures under CC0 license
tools
: Host toolscmgen
: Image-based lighting asset generatorfilamesh
: Mesh converterglslminifier
: Minifies GLSL source codematc
: Material compilermatinfo
Displays information about materials compiled withmatc
mipgen
Generates a series of miplevels from a source imagenormal-blending
: Tool to blend normal mapsresgen
Aggregates binary blobs into embeddable resourcesroughness-prefilter
: Pre-filters a roughness map from a normal map to reduce aliasingskygen
: Physically-based sky environment texture generatorspecular-color
: Computes the specular color of conductors based on spectral data
web
: JavaScript bindings, documentation, and samples
Please see LICENSE.
This is not an officially supported Google product.