setupProgram() {
        let existingProgram = this.renderer.cache.getProgramFromShaders(this.vsCode, this.fsCode);

        // we found an existing program
        if(existingProgram) {
            // we need to create a new program but we don't have to re compile the shaders
            this.vertexShader = existingProgram.vertexShader;
            this.fragmentShader = existingProgram.fragmentShader;

            // copy active uniforms and attributes as well
            this.activeUniforms = existingProgram.activeUniforms;
            this.activeAttributes = existingProgram.activeAttributes;

            this.createProgram();
        }
        else {
            // compile the new shaders and create a new program
            this.useNewShaders();
            if(this.compiled) {
                this.createProgram();

                // add it to our program manager programs list
                this.renderer.cache.addProgram(this);
            }
        }
    }
Checks whether the program has already been registered before creating it
     If yes, use the compiled shaders to create a new one with createProgram()
     If not, compile the shaders and call createProgram()
*