{"id":3609,"date":"2024-08-19T21:14:25","date_gmt":"2024-08-19T18:14:25","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2024\/08\/19\/bgfx-emscripten\/"},"modified":"2024-12-16T22:32:13","modified_gmt":"2024-12-16T19:32:13","slug":"bgfx-emscripten","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/zh\/2024\/08\/19\/bgfx-emscripten\/","title":{"rendered":"\u6784\u5efa bgfx Emscripten \u5e94\u7528\u7a0b\u5e8f"},"content":{"rendered":"<p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u5c06\u63cf\u8ff0\u4e00\u79cd\u4f7f\u7528 Emscripten \u6784\u5efa bgfx \u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f (WebAssembly) \u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u5b89\u88c5\u5e73\u53f0\u4e3aLinux x86-64\uff0c\u4f8b\u5982Arch Linux\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5b89\u88c5Emscripten 3.1.51\u7248\u672c\uff0c\u5426\u5219\u4f60\u4e0d\u4f1a\u6210\u529f\uff0c\u8fd9\u90fd\u662f\u56e0\u4e3a\u6700\u65b0\u7248\u672c\u7684Emscripten\u4e2d\u52a8\u6001\u5e93\u7684\u7c7b\u578b\u53d1\u751f\u4e86\u53d8\u5316\u3002\u60a8\u53ef\u4ee5\u5728\u8fd9\u91cc\u9605\u8bfb\u66f4\u591a\u5185\u5bb9\uff1a<br \/>\n<a href=\"https:\/\/github.com\/bkaradzic\/bgfx\/discussions\/3266\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/bkaradzic\/bgfx\/discussions\/3266<\/a <\/p>\n<p>\u8fd9\u6837\u505a\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\ngit clone https:\/\/github.com\/emscripten-core\/emsdk.git\n\n\n\ncd emsdk\n\n\n\n.\/emsdk install 3.1.51\n\n\n\n.\/emsdk activate 3.1.51\n\n\n\nsource .\/emsdk_env.sh\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u8ba9\u6211\u4eec\u4e3a WebAssembly \u7ec4\u88c5 bgfx &#8211;\u811a\u672c\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\nmkdir bgfx-build-test\n\n\n\ncd bgfx-build-test\n\n\n\ngit clone https:\/\/github.com\/bkaradzic\/bx.git\n\n\n\ngit clone https:\/\/github.com\/bkaradzic\/bimg.git\n\n\n\ngit clone https:\/\/github.com\/bkaradzic\/bgfx.git\n\n\n\ncd bgfx\n\n\n\nemmake make wasm-debug\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u56e0\u6b64\uff0c\u5728 .build \u6587\u4ef6\u5939\u4e2d\uff0c\u60a8\u5c06\u62e5\u6709\u6269\u5c55\u540d\u4e3a .bc \u7684\u4f4d\u7801\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u9700\u8981\u4e0e\u60a8\u7684 bgfx \u5e94\u7528\u7a0b\u5e8f\u94fe\u63a5\u3002<br \/>\n\u5e94\u8be5\u662fbgfx.bc\u3001bx.bc\u3001bimg.bc\uff1b\u4e0d\u540c\u7684\u7a0b\u5e8f\u96c6\u5bf9\u8fd9\u4e9b\u6587\u4ef6\u6709\u4e0d\u540c\u7684\u540d\u79f0\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u7a0b\u5e8f\u96c6\u7684\u7c7b\u578b\uff08\u53d1\u5e03\/\u8c03\u8bd5\uff09<\/p>\n<p>\u6dfb\u52a0\u5e26\u6709 .bc \u6587\u4ef6\u7684 CMakeLists.txt \u6587\u4ef6\u7684\u94fe\u63a5\uff0c\u4f8b\u5982 bgfx-experiments \u9879\u76ee\u4e2d\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\ntarget_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)\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u73b0\u5728\u5c06\u5e73\u53f0\u6570\u636e\u4e2d\u7684\u672c\u673a\u7a97\u53e3\u53e5\u67c4\u66f4\u6539\u4e3a bgfx \u521d\u59cb\u5316\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\nbgfx::PlatformData platformData{};\n\n\n\nplatformData.context = NULL;\n\n\n\nplatformData.backBuffer = NULL;\n\n\n\nplatformData.backBufferDS = NULL;\n\n\n\nplatformData.nwh = (void*)\"#canvas\";\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u60a8\u8fd8\u9700\u8981\u5c06\u6e32\u67d3\u7c7b\u578b\u66f4\u6539\u4e3a OpenGL\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\nbgfx::Init init;\n\n\n\ninit.type = bgfx::RendererType::OpenGL;\n\n\n\n\n\n\n\ninit.resolution.width = screenWidth;\n\n\n\ninit.resolution.height = screenHeight;\n\n\n\ninit.resolution.reset = BGFX_RESET_VSYNC;\n\n\n\ninit.platformData = platformData;\n\n\n\n\n\n\n\nif (!bgfx::init(init))\n\n\n\n{\n\n\n\n    throw std::runtime_error(\"Failed to initialize bgfx\");\n\n\n\n}\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u5c06 GLSL \u7740\u8272\u5668\u91cd\u65b0\u7f16\u8bd1\u4e3a 120\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\nshaderc -f \"VertexShader.vs\" -o \"VertexShader.glsl\" --type \"v\" -p \"120\"\n\n\n\nshaderc -f \"FragmentShader.fs\" -o \"FragmentShader.glsl\" --type \"f\" -p \"120\"\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u662f\u7684\uff0c\u4f46\u662f .glsl \u6587\u4ef6\u5fc5\u987b\u4f5c\u4e3a\u201c\u9884\u52a0\u8f7d\u6587\u4ef6\uff1a\u201d\u6dfb\u52a0\u5230 CMakeLists.txt \u4e2d\uff1a<\/p>\n<div class=\"hcb_wrap\">\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\nset(CMAKE_CXX_FLAGS ... <\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c>\n\n\n\n--preload-file VertexShader.glsl \\\n\n\n\n--preload-file FragmentShader.glsl \\\n\n\n\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>\u4ecd\u7136\u9700\u8981\u901a\u8fc7 emscripten_set_main_loop \u4f7f\u7528 while \u51fd\u6570\u8c03\u7528\u66ff\u6362\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u4e3b\u6e32\u67d3\u5faa\u73af\u3002<\/p>\n<p>\u60a8\u53ef\u4ee5\u5728\u8fd9\u91cc\u9605\u8bfb\uff1a<br \/>\n<a href=\"https:\/\/demensdeum.com\/blog\/ru\/2017\/03\/29\/porting-sdl-c-game-to-html5-emscripten\/\" rel=\"noopener\" target=\"_blank\">https :\/\/demensdeum.com\/blog\/ru\/2017\/03\/29\/porting-sdl-c-game-to-html5-emscripten\/<\/a><\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u50cf\u5f80\u5e38\u4e00\u6837\u7ec4\u88c5\u60a8\u7684 Emscripten \u9879\u76ee\uff0c\u4e00\u5207\u90fd\u5e94\u8be5\u6b63\u5e38\u3002<br \/>\n\u6709\u8da3&#8211; Emscripten 3.1.51 \u7248\u672c\u4f3c\u4e4e\u7f3a\u5c11 OpenAL\uff08\u6216\u8005\u53ea\u662f\u6211\uff09\u3002<\/p>\n<p>\u4f7f\u7528bgfx\u548cEmscripten\u6b63\u786e\u7f16\u8bd1\u7684\u9879\u76ee\u6e90\u4ee3\u7801\uff1a<br \/>\n<a href=\"https:\/\/github.com\/demensdeum\/bgfx-experiments\/tree\/main\/2-emscripten-build\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/demensdeum\/ bgfx-experiments\/tree\/main\/2-emscripten-build<\/a><\/p>\n<p>\u6765\u6e90<\/p>\n<p><a href=\"https:\/\/github.com\/bkaradzic\/bgfx\/discussions\/3266\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/bkaradzic\/bgfx\/discussions\/3266 <\/a><br \/>\n<a href=\"https:\/\/bkaradzic.github.io\/bgfx\/build.html\" rel=\"noopener\" target=\"_blank\">https:\/\/bkaradzic.github.io\/bgfx\/build.html<\/a ><br \/>\n<a href=\"https:\/\/emscripten.org\/docs\/getting_started\/downloads.html\" rel=\"noopener\" target=\"_blank\">https:\/\/emscripten.org\/docs\/getting_started\/downloads.html<\/a ><br \/>\n<a href=\"https:\/\/demensdeum.com\/blog\/ru\/2017\/03\/29\/porting-sdl-c-game-to-html5-emscripten\/\" rel=\"noopener\" target=\"_blank\">https :\/\/demensdeum.com\/blog\/ru\/2017\/03\/29\/porting-sdl-c-game-to-html5-emscripten\/<\/a><br \/>\n<a href=\"https:\/\/llvm.org\/docs\/BitCodeFormat.html\" rel=\"noopener\" target=\"_blank\">https:\/\/llvm.org\/docs\/BitCodeFormat.html<\/a><\/p >\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\uff0c\u6211\u5c06\u63cf\u8ff0\u4e00\u79cd\u4f7f\u7528 Emscripten \u6784\u5efa bgfx \u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f (WebAssembly) \u7684\u65b9\u6cd5\u3002 \u5b89\u88c5\u5e73\u53f0\u4e3aLinux x86-64\uff0c\u4f8b\u5982Arch Linux\u3002 \u9996\u5148\uff0c\u6211\u4eec\u5b89\u88c5Emscripten 3.1.51\u7248\u672c\uff0c\u5426\u5219\u4f60\u4e0d\u4f1a\u6210\u529f\uff0c\u8fd9\u90fd\u662f\u56e0\u4e3a\u6700\u65b0\u7248\u672c\u7684Emscripten\u4e2d\u52a8\u6001\u5e93\u7684\u7c7b\u578b\u53d1\u751f\u4e86\u53d8\u5316\u3002\u60a8\u53ef\u4ee5\u5728\u8fd9\u91cc\u9605\u8bfb\u66f4\u591a\u5185\u5bb9\uff1a https:\/\/github.com\/bkaradzic\/bgfx\/discussions\/3266<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-3609","post","type-post","status-publish","format-standard","hentry","category-misc","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"zh","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/posts\/3609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/comments?post=3609"}],"version-history":[{"count":37,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/posts\/3609\/revisions"}],"predecessor-version":[{"id":3859,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/posts\/3609\/revisions\/3859"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/media?parent=3609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/categories?post=3609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/zh\/wp-json\/wp\/v2\/tags?post=3609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}