Skip to content

Latest commit

 

History

History
58 lines (42 loc) · 2.23 KB

EMSCRIPTEN.md

File metadata and controls

58 lines (42 loc) · 2.23 KB

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 Emscripten's 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 Emscripten's 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:

#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;
}