1. 程式人生 > >開源引擎bgfx移植Windows和Android版本

開源引擎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"
建立一個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檔案,便可以看到一些酷炫的效果展示。

參考連結:
官方連結