我之前写过两篇Filament编译文档,就在我的网站上,可以到如下地址找到:
现在又在做安卓有关开发和编译的问题,尤其是涉及到C++原生代码编译so文件,然后安卓端引入打包成apk,这一套流程Filament都有。另外,它还有Vulkan后端,并配合OpenGL后端可以切换,它还是个PBR渲染引擎,和我目前在做的工作可谓非常吻合。因此,我又要学习Filament了,尤其是编译这一块,是我目前主要需要打通的工作点。
更多的不写了,前面两篇文档记录很详尽,几十页内容,从编译tools,到aar,到出apk包,以及jni、jar、so和a文件,dll和lib文件都有介绍。这里我补充介绍编译的问题,以便以后查看。
代码下载:
git clone --recursive https://github.com/google/filament.git
下载后得到目录filament,这就是后面会用到的根目录。然后准备编译Visual Studio的工程,就是在根目录建立out目录,然后out目录下建立cmake-windows-release目录。然后打开cmake,source选择根目录,build选择刚刚新建的cmake-windows-release目录。构建的时候默认启用了opengl,注意勾选它下面的FILAMENT_SUPPORTS_VULKAN,然后生成即可。这里以前可能还需要clang,现在filament已经转向vs了。
然后选全部编译,没有问题,可以编译一百多项目。选择material_sandbox作为启动项目,设置命令参数:
-a vulkan ..\..\..\assets\models\monkey\monkey.obj
即可渲染出来猴子的模型,可以在我之前的文档中看到效果,这里不贴了。
然后是编译安卓,先创建out/release/filament目录,然后需要编译桌面版工具。out目录下新建cmake-release,用Visual Studio x64 Native Tools Command Prompt执行,不是cmd或者powershell的命令行:
cmake ..\.. -G Ninja -DFILAMENT_SUPPORTS_VULKAN=ON -DCMAKE_INSTALL_PREFIX=..\release\filament -DCMAKE_BUILD_TYPE=Release
ninja install
这里out/release/filament目录下会生成bin,docs,include和lib等目录,bin目录下有matc等exe,后续编译安卓的时候要用。
然后创建out/android-release/filament,接着创建out/cmake-android-release-aarch64目录,进入该目录执行:
cmake ..\.. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=..\android-release\filament -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-aarch64-linux-android.cmake -DFILAMENT_SUPPORTS_VULKAN=ON
ninja install
这里out/android-release/filament目录下会生成include和lib目录,lib目录下会根据abi分不同的子目录,如arm64-v8a,该目录下会得到许多.a文件。
这样安卓的生成就完成了,注意我只用了arm64-v8a。然后需要生成aar,就进入根目录的android目录,用cmd命令行执行,注意是cmd,powershell不行,会报错filament not found in root project。powershell执行的时候gradlew报错找不到,加上“.\gradlew”执行报错filament not found in root project,而cmd执行的时候连“.\gradlew”都不需要,而且直接gradlew就执行成功了,看来cmd和powershell执行命令还是略有不同的,虽然大多数情况下一样。
用cmd在该目录下执行:
gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament -Pextra_cmake_args=-DFILAMENT_SUPPORTS_VULKAN=ON -Pcom.google.android.filament.abis=arm64-v8a -Pfilament_skip_samples assembleRelease
这样就得到了aar文件,生成完毕。如果遇到read system property https.proxyHost报错,可以设置根目录下的android/gradle.properties:
android.builder.sdkDownload=false
然后将根目录下的android/filament-android/build/outputs/aar/filament-android-release.aar拷贝到out目录。
对于filament的几个build.gradle,如果报错缺少v7的a文件等错误,可以用ndk指定仅使用v8的,参考如下:
defaultConfig {
minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk
externalNativeBuild {
cmake {
arguments.add("-DANDROID_PIE=ON")
arguments.add("-DANDROID_PLATFORM=android-${versions.targetSdk}".toString())
arguments.add("-DANDROID_STL=c++_static")
arguments.add("-DFILAMENT_DIST_DIR=${filamentPath}".toString())
cppFlags.add("-std=c++14")
if (project.hasProperty('extra_cmake_args')) {
arguments.add(extra_cmake_args)
}
}
}
ndk {
abiFilters 'arm64-v8a'
}
}
或者更推荐这种做法,根目录下的android/gradle.properties里面有com.google.android.filament.abis选项,将all改为arm64-v8a。然后Android Studio打开工程,点一下samples里面的一个,如image based lighting,然后鼠标放到Build菜单点开,会有Make Module这个具体的sample的选项,这样就不用全部samples都编译了。
然后将后端设置为vulkan,只需要将MainActivity.kt中的引擎加vulkan参数即可:
engine = Engine.create(Engine.Backend.VULKAN)
将该sample编译的apk安装到手机运行即可。