この投稿では、Emscripten を使用して Web (WebAssembly) 用の bgfx アプリケーションを構築する方法について説明します。
インストール プラットフォームは、Arch Linux などの Linux x86-64 です。
まず、Emscripten バージョン 3.1.51 をインストールしましょう。そうでないと、Emscripten の最新バージョンではダイナミック ライブラリのタイプが変更されているため、成功しません。詳細はこちらでご覧いただけます:
https://github.com/bkaradzic/bgfx/Discussions/3266
これは次のように行われます:
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install 3.1.51
./emsdk activate 3.1.51
source ./emsdk_env.sh
WebAssembly 用に bgfx をアセンブルしましょう –エムスクリプト:
mkdir bgfx-build-test
cd bgfx-build-test
git clone https://github.com/bkaradzic/bx.git
git clone https://github.com/bkaradzic/bimg.git
git clone https://github.com/bkaradzic/bgfx.git
cd bgfx
emmake make wasm-debug
その結果、.build フォルダーには .bc 拡張子の付いたビットコード ファイルが作成されます。これは、bgfx アプリケーションにリンクする必要があります。
bgfx.bc、bx.bc、bimg.bc である必要があります。アセンブリが異なると、アセンブリのタイプ (リリース/デバッグ) に応じて、これらのファイルの名前も異なります。
.bc ファイルを含む CMakeLists.txt ファイルへのリンク (たとえば、bgfx-experiments プロジェクトのファイルへの絶対パス) を追加します。
target_link_libraries(${PROJECT_NAME} SDL2 GL /home/demensdeum_stream/Sources/bgfx-build/bgfx/.build/wasm/bin/bgfxDebug.bc /home/demensdeum_stream/Sources/bgfx-build/bgfx/.build/wasm/bin/bxDebug.bc /home/demensdeum_stream/Sources/bgfx-build/bgfx/.build/wasm/bin/bimgDebug.bc)
次に、プラットフォーム データのネイティブ ウィンドウ ハンドルを bgfx 初期化に変更します。
bgfx::PlatformData platformData{};
platformData.context = NULL;
platformData.backBuffer = NULL;
platformData.backBufferDS = NULL;
platformData.nwh = (void*)"#canvas";
レンダリング タイプを OpenGL に変更する必要もあります。
bgfx::Init init;
init.type = bgfx::RendererType::OpenGL;
init.resolution.width = screenWidth;
init.resolution.height = screenHeight;
init.resolution.reset = BGFX_RESET_VSYNC;
init.platformData = platformData;
if (!bgfx::init(init))
{
throw std::runtime_error("Failed to initialize bgfx");
}
GLSL シェーダを 120 に再コンパイルします:
shaderc -f "VertexShader.vs" -o "VertexShader.glsl" --type "v" -p "120"
shaderc -f "FragmentShader.fs" -o "FragmentShader.glsl" --type "f" -p "120"
はい、ただし、.glsl ファイルは –preload-file: として CMakeLists.txt に追加する必要があります:
set(CMAKE_CXX_FLAGS ... <Остальная часть>
--preload-file VertexShader.glsl \
--preload-file FragmentShader.glsl \
アプリケーションのメイン レンダー ループを、emscripten_set_main_loop による while 関数呼び出しに置き換える作業が残ります。
これについてはここで読むことができます:
https ://demensdeum.com/blog/ru/2017/03/29/porting-sdl-c-game-to-html5-emscripten/
次に、通常どおり Emscripten プロジェクトをアセンブルします。すべてが機能するはずです。
興味深い – Emscripten 3.1.51 ビルドには OpenAL (または私だけ) が欠けているようです。
bgfx と Emscripten で正しくコンパイルされるプロジェクトのソース コード:
https://github.com/demensdeum/ bgfx-experiments/tree/main/2-emscripten-build
ソース
https://github.com/bkaradzic/bgfx/Discussions/3266
https://bkaradzic.github.io/bgfx/build.html
https://emscripten.org/docs/getting_started/downloads.html
https ://demensdeum.com/blog/ru/2017/03/29/porting-sdl-c-game-to-html5-emscripten/
https://llvm.org/docs/BitCodeFormat.html