loadCanvas(
        source,
        textureOptions = {},
        successCallback
    ) {
        let options = Object.assign({}, textureOptions);
        // merge texture options with its parent textures options if needed
        if(this._parent) {
            options = Object.assign(textureOptions, this._parent._texturesOptions);
        }

        options.loader = this;
        options.sampler = source.hasAttribute("data-sampler") ? source.getAttribute("data-sampler") : options.sampler;

        // create a new texture that will use our source later
        const texture = new Texture(this.renderer, options);

        // add a new entry in our elements array
        this._addElement(source, texture, successCallback, null);

        // canvas are directly loaded
        this._sourceLoaded(source, texture, successCallback);

        // if there's a parent (PlaneTextureLoader) add texture and source to it
        this._parent && this._addToParent(texture, source, "canvas");
    }
This method loads a canvas
     Creates a new texture object right away and uses the canvas as our WebGL texture

     params:
     @source (canvas): html canvas element
     @textureOptions (object): parameters to apply to the textures, such as sampler name, repeat wrapping, filters, anisotropy...
     @successCallback (function): function to execute when the source has been loaded
*