init(option){
        // option check
        if(option === null || option === undefined){return;}
        if(!option.hasOwnProperty('target') || option.target === null || option.target === undefined){return;}
        if(!(option.target instanceof HTMLElement)){return;}
        // init canvas
        this.target = this.eventTarget = option.target;
        if(this.target.tagName.match(/canvas/i)){
            this.canvas = this.target;
        }else{
            this.canvas = document.createElement('canvas');
            this.target.appendChild(this.canvas);
        }
        // init webgl context
        const opt = {alpha: false, preserveDrawingBuffer: true};
        this.gl = this.canvas.getContext('webgl2', opt);
        this.isWebGL2 = this.gl != null;
        if(this.isWebGL2 === true){
            // in WebGL2
            this.gl.getExtension('EXT_color_buffer_float');
            this.extension.floatLinear = this.gl.getExtension('OES_texture_float_linear');
        }else{
            // in WebGL1
            this.gl = this.canvas.getContext('webgl', opt);
            this.gl.getExtension('OES_standard_derivatives');
            // renderable color buffer float
            this.extension.float = this.gl.getExtension('OES_texture_float');
            this.extension.colorBufferFloat = this.gl.getExtension('WEBGL_color_buffer_float');
            this.extension.floatLinear = this.gl.getExtension('OES_texture_float_linear');
            if(this.extension.float == null){
                // renderable color buffer half float
                this.extension.halfFloat = this.gl.getExtension('OES_texture_half_float');
                this.extension.colorBufferHalfFloat = this.gl.getExtension('EXT_color_buffer_half_float');
                this.extension.halfFloatLinear = this.gl.getExtension('OES_texture_half_float_linear');
            }
        }
        if(this.gl == null){
            console.log('webgl unsupported');
            return;
        }
        // check event
        if(option.hasOwnProperty('eventTarget') && option.eventTarget !== null && option.eventTarget !== undefined){
            this.eventTarget = option.eventTarget;
        }
        if(option.hasOwnProperty('mouse') && option.mouse === true){
            this.eventTarget.addEventListener('pointermove', this.mouseMove, false);
        }
        if(option.hasOwnProperty('escape') && option.escape === true){
            window.addEventListener('keydown', this.keyDown, false);
        }
        if(option.hasOwnProperty('resize') && option.resize === true){
            this.resize = true;
            window.addEventListener('resize', this.rect, false);
        }
        if(option.hasOwnProperty('offsetTime') && option.offsetTime > 0.0){
            this.offsetTime = option.offsetTime;
        }
        // render initial
        this.VS = 'attribute vec3 p;void main(){gl_Position=vec4(p,1.);}';
        this.postVS = `
attribute vec3 position;
varying   vec2 vTexCoord;
void main(){
    vTexCoord   = (position + 1.0).xy / 2.0;
    gl_Position = vec4(position, 1.0);
}`;
        this.postFS = `
precision mediump float;
uniform sampler2D texture;
varying vec2      vTexCoord;
void main(){
    gl_FragColor = texture2D(texture, vTexCoord);
}`;
        this.postProgram = this.gl.createProgram();
        let vs = this.createShader(this.postProgram, 0, this.postVS);
        let fs = this.createShader(this.postProgram, 1, this.postFS);
        this.gl.linkProgram(this.postProgram);
        this.gl.deleteShader(vs);
        this.gl.deleteShader(fs);
        this.postUniLocation = {};
        this.postUniLocation.texture = this.gl.getUniformLocation(this.postProgram, 'texture');
        this.postAttLocation = this.gl.getAttribLocation(this.postProgram, 'position');

        this.post300VS = `#version 300 es
in  vec3 position;
out vec2 vTexCoord;
void main(){
    vTexCoord   = (position + 1.0).xy / 2.0;
    gl_Position = vec4(position, 1.0);
}`;
        this.post300FS = `#version 300 es
precision mediump float;
uniform sampler2D drawTexture;
in vec2 vTexCoord;
layout (location = 0) out vec4 outColor;
void main(){
    outColor = texture(drawTexture, vTexCoord);
}`;
        if(this.isWebGL2 === true){
            this.post300Program = this.gl.createProgram();
            vs = this.createShader(this.post300Program, 0, this.post300VS);
            fs = this.createShader(this.post300Program, 1, this.post300FS);
            this.gl.linkProgram(this.post300Program);
            this.gl.deleteShader(vs);
            this.gl.deleteShader(fs);
            this.post300UniLocation = {};
            this.post300UniLocation.texture = this.gl.getUniformLocation(this.post300Program, 'drawTexture');
            this.post300AttLocation = this.gl.getAttribLocation(this.post300Program, 'position');
        }

        this.fFront = this.fBack = this.fTemp = null;
        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.gl.createBuffer());
        this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([-1,1,0,-1,-1,0,1,1,0,1,-1,0]), this.gl.STATIC_DRAW);
        this.gl.disable(this.gl.DEPTH_TEST);
        this.gl.disable(this.gl.CULL_FACE);
        this.gl.disable(this.gl.BLEND);
        this.gl.clearColor(0.0, 0.0, 0.0, 1.0);
    }
initialize fragmen.js
@param {object} option - options