javascript - 使用 Emscripten 将 C++ ImpulseEngine 编译成 JavaScript

标签 javascript c++ opengl webgl emscripten

使用 Emscripten,我一直在尝试编译 ImpulseEngine project by Randy Gaul (C++)到 JavaScript 程序。运行 Emscripten 后,我按照描述的教程进行操作 here .我遵循了所有步骤:将 .cpp 文件链接到 .bc 文件,然后将它们编译成 .js。

这是我运行的命令列表:

.cpp -> .bc:

emcc ImpulseEngine-master/main.cpp -o main.bc
emcc ImpulseEngine-master/Scene.cpp -o Scene.bc
emcc ImpulseEngine-master/Render.cpp -o Render.bc
emcc ImpulseEngine-master/Precompiled.cpp -o Precompiled.bc
emcc ImpulseEngine-master/Manifold.cpp -o Manifold.bc
emcc ImpulseEngine-master/Collision.cpp -o Collision.bc
emcc ImpulseEngine-master/Clock.cpp -o Clock.bc
emcc ImpulseEngine-master/Body.cpp -o Body.bc

.bc -> .js

emcc main.bc Scene.bc Render.bc Precompiled.bc Manifold.bc Collision.bc Clock.bc Body.bc -s LEGACY_GL_EMULATION=1 -o github/khanfusiion3.github.io/index.html

注意 -s LEGACY_GL_EMULATION=1 选项:这是为了启用 OpenGL 功能。当然,当我运行命令时,我仍然收到一些关于未解析符号的警告,如下所示:

warning: unresolved symbol: glPointSize
warning: unresolved symbol: glRasterPos2i
warning: unresolved symbol: glutBitmapCharacter
warning: unresolved symbol: glutBitmap9By15

理论上,无论接下来发生什么,程序现在都会失败,但我还是试过了。它立即抛出错误并退出。以下是记录到控制台的每个错误的列表:

WARNING: using emscripten GL emulation. This is a collection of limited workarounds, do not expect it to work.Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 WARNING: using emscripten GL emulation unsafe opts. If weirdness happens, try -s GL_UNSAFE_OPTS=0Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 pre-main prep time: 12 msModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 WARNING: using emscripten GL immediate mode emulation. This is very limited in what it supportsModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 missing function: glRasterPos2iModule.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1237 -1
khanfusiion3.github.io/:1249 -1Module.printErr @ khanfusiion3.github.io/:1249
khanfusiion3.github.io/:1249 warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demanglingModule.printErr @ khanfusiion3.github.io/:1249
/index.js:1879 Uncaught abort(-1) at Error
    at jsStackTrace (http://khanfusiion3.github.io/index.js:1060:13)
    at stackTrace (http://khanfusiion3.github.io/index.js:1077:22)
    at abort (http://khanfusiion3.github.io/index.js:25065:44)
    at _glRasterPos2i (http://khanfusiion3.github.io/index.js:8051:58)
    at __Z12RenderStringiiPKc (http://khanfusiion3.github.io/index.js:13374:2)
    at Array.__Z11PhysicsLoopv (http://khanfusiion3.github.io/index.js:9462:2)
    at dynCall_v (http://khanfusiion3.github.io/index.js:24605:30)
    at Object.Runtime.dynCall (http://khanfusiion3.github.io/index.js:331:39)
    at http://khanfusiion3.github.io/index.js:8107:21
    at Object.Browser.mainLoop.runIter (http://khanfusiion3.github.io/index.js:1873:13)

我也尝试使用 -s DEMANGLE_SUPPORT=1 选项运行它,但其他错误并没有停止,所以它仍然失败。

关于导致错误的原因以及如何修复它们的任何帮助?

最佳答案

ImpulseEngine 使用 OpenGL,这是一个非常复杂的 API 程序,用于通过专用驱动程序访问图形硬件。驱动程序和相关的 API 在浏览器环境 emscripten 目标中不可用;你不会让它工作的。

如果您能找到一个类似的以 SDL 为目标的库——一个提供更高级别图形 API 封装的常用库——您可以将它移植到 emscripten,因为 emscripten 声称支持 SDL。在这种情况下,emscripten 将提供 SDL 图形调用的低级实现,将它们转换为适当的 javascript 兼容 API。

关于javascript - 使用 Emscripten 将 C++ ImpulseEngine 编译成 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823810/

相关文章:

javascript - 如何将此 svg 包含在 react 组件中?

javascript - 获取哈希值 Rails/Chart.JS

c++ - 我的代码应该渲染立方体的正面,而不是显示背面。为什么?

c++ - 解除绑定(bind)后无法绑定(bind)套接字

c++ - 我对 GLM lookAt 函数的理解不一致

optimization - 剪辑发生在渲染的哪个阶段?

javascript - jQuery .map() 到纯 javascript

javascript - 在 <md-tab-content> 标签下使用 ui-view

c++ - Lambda 捕获和内存管理

c++ - 带有 make_unique 和 emplace_back 的简单结构