decoupled webgl and canvas renderers