Filament簡(jiǎn)介
Filament是Google開(kāi)源的實(shí)時(shí)PBR渲染引擎蹬敲,其可以用于Android赋荆、iOS午磁、macOS尝抖、Windows毡们、Linux和WebGL,是一款很新的3D渲染引擎昧辽。
是Google的AR引擎ARCore里默認(rèn)的渲染引擎衙熔,用在了其Sceneform渲染庫(kù)中。同時(shí)也作為Android插件搅荞,可以直接在Android Studio中預(yù)覽3D model红氯。
開(kāi)源地址為:https://github.com/google/filament
編譯Demo
1.編譯Filament
filament-master跟目錄下的build.sh的shell文件包含了所有平臺(tái)的編譯過(guò)程,生成的編譯后文件會(huì)放在out/目錄下咕痛。
為了編譯某個(gè)平臺(tái)痢甘,比如Android平臺(tái),需要進(jìn)行配置茉贡。也可以在build文件夾里塞栅,尋找各平臺(tái)各自的編譯文件。
比如build/android文件夾里腔丧,運(yùn)行build.sh即可編譯Android平臺(tái)的Filament放椰。
cd build/android
./build.sh release
等待編譯完成后,在根目錄的out文件夾里就會(huì)生成Android平臺(tái)的Filament編譯文件愉粤。
2.運(yùn)行Android的demo
進(jìn)入到跟目錄下的android文件夾里砾医,里面的文件目錄結(jié)構(gòu)為:
- build : android工程的filament的gradle文件,用于引入引擎需要的庫(kù)衣厘,比如matc庫(kù)等如蚜。
- common : android的幾個(gè)demo通用的文件。
- filamat-android : 用于編譯渲染材質(zhì)的庫(kù)头滔,調(diào)用了
matc
怖亭。橋接了java和native代碼 - filament-android : filament的各種渲染部分,比如相機(jī)坤检、天空盒子兴猩、box等,橋接了java和native代碼早歇。
- gltfio-android : 用于加載glTF文件倾芝。GLTF代表Graphics Language Transmission Format(圖形語(yǔ)言傳輸格式)。這種跨平臺(tái)格式已成為Web上的3D對(duì)象標(biāo)準(zhǔn)箭跳。
- samples : 里面包含了多個(gè)Android的demo晨另。
- Windows.md : 介紹了如何在Windows上編譯Filament for Android。
注意:本文環(huán)境是在macOS上谱姓,所有編譯過(guò)程都在macOS上進(jìn)行借尿。
寫(xiě)完這里,第一步的編譯過(guò)程也完成了,此時(shí)在根目錄的out/文件夾里已經(jīng)生成了filament for android的編譯文件路翻。
在Android Studio里打開(kāi)android/samples/hello-camera工程狈癞,這個(gè)工程將手機(jī)的相機(jī)渲染到一個(gè)3D的旋轉(zhuǎn)的box上。
實(shí)際上此時(shí)項(xiàng)目編譯無(wú)法通過(guò)茂契,會(huì)報(bào)錯(cuò):
No matc binary could be found in /Users/junhu/Downloads/filament-master/out/release/filament/bin. Ensure Filament has been built/installed before building this app.
如何解決這個(gè)問(wèn)題呢蝶桶?
在hello-camera的build.gradle(非項(xiàng)目的build.gradle)文件里看到一個(gè)配置:
apply from: '../../../build/filament-tasks.gradle'
引用了配置文件filament-tastk.gradle,在android/build/文件夾里找到掉冶,打開(kāi)會(huì)看到:
def filamentToolsPath = file("../../../../out/release/filament")
if (project.hasProperty("filament_tools_dir")) {
filamentToolsPath = file("$filament_tools_dir")
}
List<File> getBinaries(String name, File toolsPath) {
def tool = ["/bin/${name}.exe", "/bin/${name}"]
def toolFullPath = tool.collect { path -> Paths.get(toolsPath.absolutePath, path).toFile() }
// Ensure that at least one matc binary and Filament library is present
if (!toolFullPath.any { path -> file(path).exists() }) {
throw new StopActionException("No ${name} binary could be found in " + toolsPath +
"/bin. Ensure Filament has been built/installed before building this app.")
}
return toolFullPath
}
ext.matcFullPath = getBinaries('matc', filamentToolsPath)
ext.cmgenFullPath = getBinaries('cmgen', filamentToolsPath)
ext.filameshFullPath = getBinaries('filamesh', filamentToolsPath)
ext.resgenFullPath = getBinaries('resgen', filamentToolsPath)
但是我們的out/文件夾里并沒(méi)有release/filament真竖。
matc、cmgen厌小、filamesh恢共、resgen幾個(gè)二進(jìn)制文件,是在根目錄里的tools/里的工具類編譯生成的召锈。
- matc :Material Compiler 材質(zhì)編譯器旁振,將mat文件編譯為filament可識(shí)別的文件
- cmgen : Image-based lighting asset generator :
- filamesh : Mesh converter 網(wǎng)格轉(zhuǎn)換器
- resgen : Aggregates binary blobs into embeddable resources
在Android的build.sh里并沒(méi)有默認(rèn)編譯這幾個(gè)工具。
編譯很耗時(shí)涨岁,可以用其他系統(tǒng)編譯的工具,比如linux或max系統(tǒng)吉嚣。
https://github.com/google/filament/releases
在release里下載已經(jīng)編譯好的梢薪,比如下載mac編譯好的。
- bin : tools下所有的工具類的編譯后的可執(zhí)行文件
- docs : 工具類的使用說(shuō)明尝哆。
將bin文件夾拷貝到filament根目錄下秉撇,out/release/filament下。
再次編譯Android項(xiàng)目秋泄,即可編譯通過(guò)琐馆。
注意:官方的demo有個(gè)bug,授予相機(jī)權(quán)限后無(wú)法得到相機(jī)畫(huà)面恒序。需要退出程序再進(jìn)入才會(huì)有相機(jī)畫(huà)面瘦麸。
Filament的使用說(shuō)明可以參考之后的分析。
Filament分析-從Android官方項(xiàng)目分析