emscripten 支持哪些最新版本的 OpenGL ES,我该如何使用它们?

What are the latest versions of OpenGL ES supported by emscripten, and how do I use them?

我正在尝试使用一些 ES 3.1 功能,但不清楚是否支持:

我注意到在 emscripten 存储库中有一个 OpenGL ES 3.1 header,其中 defines 我正在寻找的一些功能,我可以将它们成功地包含在我的项目中。但是,当我尝试 link:

时它们不可用
error: undefined symbol: glDispatchCompute (referenced by top-level compiled C/C++ code)
warning: _glDispatchCompute may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library

documentation 表示如果我指定 -s FULL_ES3=1(我正在这样做),则支持 OpenGL ES3。

既然有header,这个功能可以用吗?如果是这样,我如何启用对它的支持? (例如,是否需要手动加载扩展或在 emscripten 中启用实验性支持?)

首先要意识到的是,体面的浏览器目前仅实现 WebGL 1.0(基于 OpenGL ES 2.0)和 WebGL 2.0(基于 OpenGL ES 3.0)。因此 Emscripten SDK 可能只实现 WebGL 2.0 + 扩展提供的功能,不幸的是,Compute Shaders 在 WebGL 中没有以任何方式呈现(并且没有更多计划添加此功能将来)。

顺便说一句,WebGL 2.0 支持已添加到 Safari 15 (iOS 15) 仅在今年 (2021),因此即使 OpenGL ES 2.0 也无法在所有设备上运行。

I notice that there is an OpenGL ES 3.1 header in the emscripten

额外的 <GLES3\gl3*.h> headers 不是因为 Emscripten 实现了所有这些,而是​​因为这是分发现有 OpenGL ES 3.x headers 的常见方式应用程序可能依赖于在运行时有条件地加载/使用 OpenGL ES 3.x 函数,当它们可用时。

The documentation says that OpenGL ES3 is supported if I specify -s FULL_ES3=1 (which I am doing).

我认为 documentation 或多或少清楚 FULL_ES3=1 添加的内容:

To enable OpenGL ES 3.0 emulation, specify the emcc option -s FULL_ES3=1 when linking the final executable (.js/.html) of the project. This adds emulation for mapping memory blocks to client side memory.

这里没有关于 OpenGL ES 3.1 的消息,也没有理由期待 Emscripten 的奇迹,因为我几乎无法想象一种合理的 hardware-accelerated 方法来模拟 OpenGL ES 3.0 之上的计算着色器之类的东西.并且软件仿真对于大多数应用程序肯定没有用。

WebGPU 1.0 承诺在 2022 年年中出现,比 WebGL 2.0 更强大。因此 WebGPU 开发人员已经看到,浏览器中的原生 WebGL 2.0 实现可能会被在 WebGPU 之上实现这一遗留 API 的 WebAssembly 模块所取代——但在某些情况下很遥远的未来。同样也可以将 OpenGL ES 3.1/3.2 功能引入 Emscripten SDK - 至少在理论上,如果有人仍然对此感兴趣的话。