Files
projectm/docs/emscripten.rst
2024-02-09 16:37:09 -06:00

70 lines
2.4 KiB
ReStructuredText
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Using libprojectM in Emscripten
===============================
projectM supports OpenGL ES rendering, and can be compiled into
WebAssembly for use in browsers. WebGL is similar to OpenGL ES, but not
identical, so a few additional considerations apply to get projectM
running with Emscripten.
Additional Build Settings
-------------------------
A few additional build settings will be required when building an
Emscripten wrapper. Pass these flags/parameterrs to the Emscripten
linker:
- ``-sUSE_SDL=2``: It is highly recommended to use Emscriptens
built-in SDL2 port to set up the rendering context. This flag will
link the appropriate library.
- ``-sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2``: Forces the use of
WebGL 2, which is required for OpenGL ES 3 emulation.
- ``-sFULL_ES2=1 -sFULL_ES3=1``: Enables full emulation support for
both OpenGL ES 2.0 and 3.0 variants.
- ``-sALLOW_MEMORY_GROWTH=1``: Allows allocating additional memory if
necessary. This may be required to load additional textures etc. in
projectM.
Initializing Emscriptens OpenGL Context
----------------------------------------
In addition to the above linker flags, some additional initialization
steps must be performed to set up the OpenGL rendering context for
projectM. Specifically, the ``OES_texture_float`` WenGL extension must
be loaded explicitly to support the required texture format for the
motion vector grid. The following code template can be used to set up a
proper SDL2/WebGL context for projectM:
.. code:: c
#include <emscripten.h>
#include <emscripten/html5_webgl.h>
#include <GL/gl.h>
#include <SDL.h>
int main(void)
{
// Init SDL's video and audio subsystems
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
// Create the SDL window (will be tied to the Emscripten HTML5 canvas)
SDL_window* window = NULL;
SDL_renderer* renderer = NULL;
SDL_CreateWindowAndRenderer(1024, 768, SDL_WINDOW_OPENGL, &window, &renderer);
if (window == NULL || renderer == NULL)
{
fprintf(stderr, "Failed to create SDL renderer: %s\n", SDL_GetError());
return 1;
}
// Enable floating-point texture support for motion vector grid.
auto webGlContext = emscripten_webgl_get_current_context();
emscripten_webgl_enable_extension(webGlContext, "OES_texture_float");
// Initialize projectM and put all other stuff below.
return 0;
}