google/filament
GitHub: google/filament
Filament 是一款跨平台轻量级实时物理渲染引擎,专注于为移动端和桌面端应用提供高性能的 3D 图形渲染能力。
Stars: 19789 | Forks: 2121
# Filament
[](https://github.com/google/filament/actions?query=workflow%3AAndroid)
[](https://github.com/google/filament/actions?query=workflow%3AiOS)
[](https://github.com/google/filament/actions?query=workflow%3ALinux)
[](https://github.com/google/filament/actions?query=workflow%3AmacOS)
[](https://github.com/google/filament/actions?query=workflow%3AWindows)
[](https://github.com/google/filament/actions?query=workflow%3AWeb)
Filament 是一个适用于 Android、iOS、Linux、macOS、Windows 和 WebGL 的实时基于物理的渲染引擎。它的设计目标是在 Android 上尽可能小且尽可能高效。
## 下载
[下载 Filament 版本](https://github.com/google/filament/releases) 以获取稳定构建。
Filament 发布归档包含生成资源所需的主机端工具。
请确保您始终使用与运行时库相同版本的工具。这对于 `matc`(材质编译器)尤为重要。
如果您希望自己构建 Filament,请参阅我们的[构建手册](/BUILDING.md)。
### Android
Android 项目只需将 Filament 库声明为 Maven 依赖项:
```
repositories {
// ...
mavenCentral()
}
dependencies {
implementation 'com.google.android.filament:filament-android:1.69.5'
}
```
以下是 `com.google.android.filament` 组中可用的所有库:
| 组件 | 描述 |
| ------------- | ------------- |
| [](https://mvnrepository.com/artifact/com.google.android.filament/filament-android) | Filament 渲染引擎本身。 |
| [](https://mvnrepository.com/artifact/com.google.android.filament/filament-android-debug) | `filament-android` 的调试版本。 |
| [](https://mvnrepository.com/artifact/com.google.android.filament/gltfio-android) | Filament 的 glTF 2.0 加载器,依赖于 `filament-android`。 |
| [](https://mvnrepository.com/artifact/com.google.android.filament/filament-utils-android) | KTX 加载、Kotlin 数学和相机实用工具,依赖于 `gltfio-android`。 |
| [](https://mvnrepository.com/artifact/com.google.android.filament/filamat-android) | 运行时材质构建器/编译器。该库体积较大,但包含完整的着色器编译器/验证器/优化器,并支持 OpenGL 和 Vulkan。 |
### iOS
iOS 项目可以使用 CocoaPods 安装最新版本:
```
pod 'Filament', '~> 1.69.5'
```
## 文档
- [Filament](https://google.github.io/filament/Filament.html),深入解释了实时基于物理的渲染、图形功能以及 Filament 的实现。本文档解释了我们大部分决策背后的数学原理和推理。对于图形程序员来说,这是了解 PBR 的良好入门读物。
- [材质](https://google.github.io/filament/Materials.html),我们材质系统的完整参考文档。本文档解释了我们不同的材质模型、如何使用材质编译器 `matc` 以及如何编写自定义材质。
- [材质属性](https://google.github.io/filament/notes/material_properties.html),标准材质模型的参考表。
## 示例






## 特性
### API
- 适用于 Android、iOS、Linux、macOS 和 Windows 的原生 C++ API
- 适用于 Android 的 Java/JNI API
- JavaScript API
### 后端
- 适用于 Linux、macOS 和 Windows 的 OpenGL 4.1+
- 适用于 Android 和 iOS 的 OpenGL ES 3.0+
- 适用于 macOS 和 iOS 的 Metal
- 适用于 Android、Linux、macOS 和 Windows 的 Vulkan 1.0
- 适用于 Android、Linux、macOS 和 Windows 的 WebGPU
- 适用于所有支持浏览器的 WebGL 2.0
### 渲染
- Clustered 前向渲染器
- Cook-Torrance 微表面高光 BRDF
- Lambertian 漫反射 BRDF
- 自定义光照/表面着色
- HDR/线性光照
- 金属度工作流
- 清漆
- 各向异性光照
- 近似半透明(次表面)材质
- 布料/织物/光泽着色
- 法线贴图 & 环境光遮蔽贴图
- 基于图像的光照
- 基于物理的相机(快门速度、感光度和光圈)
- 物理光单位
- 点光源、聚光灯和定向光
- 高光抗锯齿
- 点光源、聚光灯和定向光阴影
- 级联阴影
- EVSM, PCSS, DPCF, 或 PCF 阴影
- 透明阴影
- 接触阴影
- 屏幕空间环境光遮蔽
- 屏幕空间反射
- 屏幕空间折射
- 全局雾
- 动态分辨率(支持 AMD FidelityFX FSR)
### 后处理
- HDR 泛光
- 景深散景
- 多种色调映射器:PBR Neutral, AgX, 通用(可自定义), ACES, 电影感等。
- 颜色和色调管理:亮度缩放、色域映射
- 调色:曝光、夜间适应、白平衡、通道混合器、阴影/中间调/高光、ASC CDL、对比度、饱和度等。
- TAA, FXAA, MSAA
- 屏幕空间镜头光晕
### glTF 2.0
- 编码
- [x] 内嵌
- [x] 二进制
- 图元类型
- [x] 点
- [x] 线
- [ ] 线环
- [x] 线带
- [x] 三角形
- [x] 三角形带
- [ ] 三角形扇
- 动画
- [x] 变换动画
- [x] 线性插值
- [x] 变形动画
- [x] 稀疏访问器
- [x] 蒙皮动画
- [x] 关节动画
- 扩展
- [x] KHR_draco_mesh_compression
- [x] KHR_lights_punctual
- [x] KHR_materials_clearcoat
- [x] KHR_materials_dispersion
- [x] KHR_materials_emissive_strength
- [x] KHR_materials_ior
- [x] KHR_materials_pbrSpecularGlossiness
- [x] KHR_materials_sheen
- [x] KHR_materials_specular
- [x] KHR_materials_transmission
- [x] KHR_materials_unlit
- [x] KHR_materials_variants
- [x] KHR_materials_volume
- [x] KHR_mesh_quantization
- [x] KHR_texture_basisu
- [x] KHR_texture_transform
- [x] EXT_meshopt_compression
## 使用 Filament 渲染
### 原生 Linux, macOS 和 Windows
您必须创建一个 `Engine`、一个 `Renderer` 和一个 `SwapChain`。`SwapChain` 是从原生窗口指针(例如 macOS 上的 `NSView` 或 Windows 上的 `HWND`)创建的:
```
Engine* engine = Engine::create();
SwapChain* swapChain = engine->createSwapChain(nativeWindow);
Renderer* renderer = engine->createRenderer();
```
要渲染一帧,您必须接着创建一个 `View`、一个 `Scene` 和一个 `Camera`:
```
Camera* camera = engine->createCamera(EntityManager::get().create());
View* view = engine->createView();
Scene* scene = engine->createScene();
view->setCamera(camera);
view->setScene(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);
```
材质实例是从材质中获取的,而材质本身是从由 `matc` 生成的二进制 blob 加载的:
```
Material* material = Material::Builder()
.package((void*) BAKED_MATERIAL_PACKAGE, sizeof(BAKED_MATERIAL_PACKAGE))
.build(*engine);
MaterialInstance* materialInstance = material->createInstance();
```
要了解更多关于材质和 `matc` 的信息,请参阅[材质文档](https://google.github.io/filament/Materials.html)。
要进行渲染,只需将 `View` 传递给 `Renderer`:
```
// beginFrame() returns false if we need to skip a frame
if (renderer->beginFrame(swapChain)) {
// for each View
renderer->render(view);
renderer->endFrame();
}
```
有关 Linux、macOS 和 Windows Filament 应用程序的完整示例,请查看 `samples/` 目录中的源文件。这些示例都基于 `libs/filamentapp/`,其中包含使用 SDL2 创建原生窗口并初始化 Filament 引擎、渲染器和视图的代码。
有关如何为基于图像的光照准备环境贴图的更多信息,请参阅 [BUILDING.md](/BUILDING.md#running-the-native-samples)。
### Android
有关如何在 Android 上使用 Filament 的示例,请参阅 `android/samples`。
您必须始终首先通过调用 `Filament.init()` 来初始化 Filament。
在 Android 上使用 Filament 渲染与从原生代码渲染类似(不同语言的 API 大致相同)。您可以通过将 `Surface` 传递给 `createSwapChain` 方法来渲染到 `Surface`。这允许您渲染到 `SurfaceTexture`、`TextureView` 或 `SurfaceView`。为了简化操作,我们在 `com.google.android.filament.android` 包中提供了一个名为 `UiHelper` 的 Android 特定 API。您只需在助手上设置渲染回调,并将您的 `SurfaceView` 或 `TextureView` 附加到它。您仍然需要在 `onNativeWindowChanged()` 回调中创建交换链。
### iOS
Filament 支持 iOS 11.0 及更高版本。有关在 iOS 上使用 Filament 的示例,请参阅 `ios/samples`。
iOS 上的 Filament 与使用 C++ 的原生渲染大致相同。将 `CAEAGLLayer` 或 `CAMetalLayer` 传递给 `createSwapChain` 方法。适用于 iOS 的 Filament 支持 Metal(首选)和 OpenGL ES。
## 资产
首先,您可以使用分别在 `third_party/textures` 和 `third_party/environments` 中找到的纹理和环境贴图。这些资产采用 CC0 许可。请参阅它们各自的 `URL.txt` 文件以了解有关原作者的更多信息。
环境必须使用 [`cmgen`](/BUILDING.md#running-the-native-samples) 或使用 `libiblprefilter` 库进行预处理。
## 目录结构
该仓库不仅包含核心 Filament 引擎,还包含其支持库和工具。
- `android`: Android 库和项目
- `filamat-android`: 适用于 Android 的 Filament 材质生成库 (AAR)
- `filament-android`: 适用于 Android 的 Filament 库 (AAR)
- `filament-utils-android`: 额外实用工具(KTX 加载器、数学类型等)
- `gltfio-android`: 适用于 Android 的 Filament glTF 加载库 (AAR)
- `samples`: Android 特定的 Filament 示例
- `art`: 各种艺术作品的来源(Logo、PDF 手册等)
- `assets`: 用于示例应用程序的 3D 资产
- `build`: CMake 构建脚本
- `docs`: 文档
- `math`: 用于探索 BRDF、方程等的 Mathematica 笔记本
- `filament`: Filament 渲染引擎(最小依赖)
- `backend`: 渲染后端/驱动程序 (Vulkan, Metal, OpenGL/ES)
- `ide`: IDE 的配置文件(CLion 等)
- `ios`: iOS 示例项目
- `libs`: 库
- `bluegl`: 适用于 macOS、Linux 和 Windows 的 OpenGL 绑定
- `bluevk`: 适用于 macOS、Linux、Windows 和 Android 的 Vulkan 绑定
- `camutils`: 相机操作实用工具
- `filabridge`: Filament 引擎和主机工具共享的库
- `filaflat`: 用于材质的序列化/反序列化库
- `filagui`: [Dear ImGui](https://github.com/ocornut/imgui) 的帮助程序库
- `filamat`: 材质生成库
- `filamentapp`: 用于构建示例应用程序的 SDL2 骨架
- `filameshio`: 微型 filamesh 解析库(另请参阅 `tools/filamesh`)
- `geometry`: 网格相关实用工具
- `gltfio`: glTF 2.0 加载器
- `ibl`: IBL 生成工具
- `image`: 图像过滤和简单变换
- `imageio`: 图像文件读取/写入,仅供内部使用
- `matdbg`: 用于在运行时检查着色器的 DebugServer(仅限调试构建)
- `math`: 数学库
- `mathio`: 输出流的数学类型支持
- `utils`: 实用程序库(线程、内存、数据结构等)
- `viewer`: glTF 查看器库(需要 gltfio)
- `samples`: 桌面示例应用程序
- `shaders`: `filamat` 和 `matc` 使用的着色器
- `third_party`: 外部库和资产
- `environments`: CC0 许可下的环境贴图,可与 `cmgen` 一起使用
- `models`: 宽松许可下的模型
- `textures`: CC0 许可下的纹理
- `tools`: 主机工具
- `cmgen`: 基于图像的光照资产生成器
- `filamesh`: 网格转换器
- `glslminifier`: 缩小 GLSL 源代码
- `matc`: 材质编译器
- `matedit`: 编译材质的材质编辑器
- `matinfo` 显示有关使用 `matc` 编译的材质的信息
- `mipgen` 从源图像生成一系列 mip 级别
- `normal-blending`: 混合法线贴图的工具
- `resgen` 将二进制 blob 聚合为可嵌入的资源
- `roughness-prefilter`: 从法线贴图预过滤粗糙度贴图以减少锯齿
- `specular-color`: 根据光谱数据计算导体的镜面反射颜色
- `web`: JavaScript 绑定、文档和示例
## 许可证
请参阅 [LICENSE](/LICENSE)。
## 免责声明
这不是一个官方支持的 Google 产品。
标签:3D图形, Android, Bash脚本, C++, DSL, Google, iOS, JS文件枚举, Nuclei, OpenGL, PBR, Vulkan, WebGL, 图形引擎, 基于物理的渲染, 实时渲染, 实时渲染引擎, 数据可视化, 数据擦除, 材质系统, 渲染库, 游戏开发, 着色器, 移动开发, 计算机图形学