constructor(renderer, {
        // Mesh params
        widthSegments,
        heightSegments,
        renderOrder,
        depthTest,
        cullFace,
        uniforms,
        vertexShaderID,
        fragmentShaderID,
        vertexShader,
        fragmentShader,
        texturesOptions,
        crossOrigin,

        // ShaderPass specific params
        depth = false,
        clear = true,
        renderTarget,
    } = {}) {
        // force plane defintion to 1x1
        widthSegments = 1;
        heightSegments = 1;

        // always cull back face
        cullFace = "back";

        // use the renderer container as our HTML element to create a DOMMesh object
        super(renderer, renderer.container, "ShaderPass", {
            widthSegments,
            heightSegments,
            renderOrder,
            depthTest,
            cullFace,
            uniforms,
            vertexShaderID,
            fragmentShaderID,
            vertexShader,
            fragmentShader,
            texturesOptions,
            crossOrigin
        });

        // return if no gl context
        if(!this.gl) {
            return;
        }

        // default to scene pass
        this._isScenePass = true;

        this.index = this.renderer.shaderPasses.length;

        this._depth = depth;

        this._shouldClear = clear;

        this.target = renderTarget;
        if(this.target) {
            // if there's a target defined it's not a scene pass
            this._isScenePass = false;
            // inherit clear param
            this._shouldClear = this.target._shouldClear;
        }

        // if the program is valid, go on
        if(this._program.compiled) {
            this._initShaderPass();

            // add shader pass to our renderer shaderPasses array
            this.renderer.shaderPasses.push(this);

            // wait one tick before adding our shader pass to the scene to avoid flickering black screen for one frame
            this.renderer.nextRender.add(() => {
                this.renderer.scene.addShaderPass(this);
            })
        }
    }
Here we create our ShaderPass object
 We will extend our DOMMesh class that handles all the WebGL part and basic HTML sizings
 ShaderPass class will add the frame buffer by creating a new RenderTarget class object

 params :
 @renderer (Curtains renderer or Renderer class object): our curtains object OR our curtains renderer object

 @Meshparams (object): see Mesh class object

 @depth (boolean, optionnal): whether the shader pass render target should use a depth buffer (see RenderTarget class object). Default to false.
 @clear (boolean, optional): whether the shader pass render target content should be cleared before being drawn (see RenderTarget class object). Default to true.
 @renderTarget (RenderTarget class object, optional): an already existing render target to use. Default to null.

 returns :
 @this: our ShaderPass element
*