開源引擎bgfx移植Windows和Android版本
bgfx作為一個跨平臺的圖形渲染庫,目前正在著手進行學習
- Cross-platform, graphics API agnostic, “Bring Your Own Engine/Framework” style rendering library.
下載
- bgfx的依賴庫比較簡單,三個git,分別對應基礎平臺、影象庫和繪製庫
mkdir bgfx
cd bgfx
git clone git://github.com/bkaradzic/bx.git
git clone git://github.com/bkaradzic/bimg.git
git clone git://github.com/bkaradzic/bgfx.git
目錄結構
- bgfx
- bgfx
- bimg
- bx
GENie
GENie是bgfx用來生成各個平臺工程檔案的工具,類似cmake
Windows平臺
編譯
- windows配置make相對編譯環境比較複雜,bgfx採用genie生成VS工程檔案
- 通過下載上述三個程式碼後,使用Windows PowerShell(win下的終端)進入bgfx/bgfx目錄,執行:
..\bx\tools\bin\windows\genie --with-examples vs2017
- –with-examples代表生成example工程檔案(examples為當前目錄中的工程資料夾)
- vs2017表示使用vs2017生成工程檔案,可以顯示指定各種版本
- 執行成功後便會在bgfx/.build/projects/vs2017目錄下生成對應的工程檔案
執行
- 開啟.build/projects/vs2017中的sln檔案,編譯完成後會在./build/win64_vs2017/bin生成可執行檔案和連結庫
- 示例工程執行的所需的資源在bgfx/bgfx/examples/runtime,WindowsPowershell需要在runtime目錄下執行,才可看到exe展示效果
../../.build/win64_vs2017/bin/example-06-bumpDebug
效果展示:
Android平臺
- android在linux或者mac下都可以進行編譯
- 最重要的是首先要配置好Android SDK的環境變數
linux: vim ~/.bashrc
mac: vim ~/.bash_profile
- 新增如下環境變數配置(根據NDK位置動態配置):
linux platform
export ANDROID_NDK_ROOT="/home/gyz/Desktop/android-ndk-r12b"
export ANDROID_NDK_ARM="/home/gyz/Desktop/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64"
export ANDROID_NDK_MIPS="/home/gyz/Desktop/android-ndk-r12b/toolchains/mipsel-linux-android-4.9/prebuilt/linux-x86_64"
export ANDROID_NDK_X86="/home/gyz/Desktop/android-ndk-r12b/toolchains/x86-4.9/prebuilt/linux-x86_64"
export ANDROID_NDK_CLANG="/home/gyz/Desktop/android-ndk-r12b/toolchains/llvm/prebuilt/linux-x86_64"
mac platform
export ANDROID_NDK_ROOT="/Users/gyz/Library/Android/sdk/ndk-bundle/"
export ANDROID_NDK_ARM="/Users/gyz/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/"
export ANDROID_NDK_MIPS="/Users/gyz/Library/Android/sdk/ndk-bundle/toolchains/mipsel-linux-android-4.9/prebuilt/darwin-x86_64/"
export ANDROID_NDK_X86="/Users/gyz/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64"
export ANDROID_NDK_CLANG="/Users/gyz/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64"
- 設定好環境變數之後在bgfx/bgfx目錄下輸入make,便會輸出可以選擇的引數
- 通過不同的編譯指令引數編譯不同硬體平臺的.so(動態連結庫)
make android-arm make android-x86 make android-mips
建立一個android空專案,使用bgfx渲染庫
將要嘗試的bgfx對應的CPU架構的動態連結庫複製到JniLibs目錄下。
cp ./build/android-arm/bin/libexample-00-helloworldRelease.so …/bgfx-android-activity/app/src/main/jniLibs/armeabi-v7a
cp ./build/android-mips/bin/libexample-00-helloworldRelease.so …/bgfx-android-activity/app/src/main/jniLibs/mips
cp ./build/android-x86/bin/libexample-00-helloworldRelease.so …/bgfx-android-activity/app/src/main/jniLibs/x86
編輯bgfx-android-activity/app/src/main/res/values/strings.xml
,替換app_name設定應用程式名稱
<resources>
<string name="app_name">BGFX Render</string>
</resources>
定義以Activity的方式載入.so檔案(不需要Java程式碼loadLibrary),必須編輯bgfx-android-activity/app/src/main/AndroidManifest.xml
android:hasCode="false">
<activity android:name="android.app.NativeActivity"
<!-- Tell NativeActivity the name of our .so (strip 'lib' and '.so') -->
<meta-data android:name="android.app.lib_name"
android:value="example-00-helloworldRelease" />
</activity>
執行專案,構建APK,並測試應用程式,APK將預設生成到bgfx-android-activity/app/build/outputs/apk
如果無法順利(make android-arm )生成對應的abi架構的動態連結庫(報各種奇怪的編譯錯誤),可以採用cmake的方式曲線救國
推薦連結:開源渲染引擎bgfx移植Android
更正其中的一處cmake錯誤:
dear-imgui lib
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wall -fno-exceptions -fno-rtti")
add_library (dear-imgui STATIC
imgui.cpp
imgui_demo.cpp
imgui_draw.cpp
imgui_widgets.cpp)
target_include_directories(dear-imgui PRIVATE
../
../../../bx/include)
target_link_libraries(dear-imgui
bx)
原作者少添加了幾個cpp
注意:靜態連結庫在編譯的時候只需要函式的宣告即可,在連結的時候會去找函式的定義(符號解析,符號重定向)
故需要將所有用到的cpp檔案包含到靜態連結庫中,若依賴其他的靜態庫,請確保依賴順序。否則undefined reference to
再更正一處程式碼:
若有錯誤
bgfxDemo\bgfx\examples\common\entry/entry.cpp:623: undefined reference to _main_
則修改entry.h
將其中的define ENTRY_CONFIG_IMPLEMENT_MAIN 0
改為define ENTRY_CONFIG_IMPLEMENT_MAIN 1
,其實函式_main_是有定義的,只是巨集開錯了而已
耐心等待,執行效果如下(example-00-helloworld):
當然還可以嘗試其餘example示例,按照推薦部落格中的做法更改專案中的.cpp檔案,便可以看到一些酷炫的效果展示。
參考連結:
官方連結