Google Filament引擎编译记录

我之前写过两篇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安装到手机运行即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片