anchor.diff:      rectangle.init(gl);
     }
   
  +  Filter2DRunner.intoFBO(gl, this._fboTarget): this.gl = gl, _fbo0 = new FBO(gl), _fbo1 = new FBO(gl) {
  +    plan = new ViewportPlan()
  +    ..viewWidth = _fboTarget.width
  +    ..viewHeight = _fboTarget.height
  +    ;
  +    rectangle = new FullScreenRectangle();
  +    rectangle.init(gl);
  +  }
  +
     run() {
       if (filters.length == 0) return;
       plan.setup(gl);
  -    var tex0 = texInit;
       if (plan.viewWidth != _fbo0.width || plan.viewHeight != _fbo0.height) {
         _fbo0.make(width: plan.viewWidth, height: plan.viewHeight, hasDepthBuff: false);
         _fbo1.make(width: plan.viewWidth, height: plan.viewHeight, hasDepthBuff: false);
       }
       var dest = _fbo0;
  +    var tex0 = texInit;
       //gl.disable(BLEND);
       //gl.disable(DEPTH_TEST);
       for(var i = 0; i < filters.length; ++i){
  
positive.code:         tex0 = (dest == _fbo0) ? _fbo1.texture : _fbo0.texture;
        }
        if (i == filters.length - 1) {
          gl.bindFramebuffer(FRAMEBUFFER, null);
        } else {
          gl.bindFramebuffer(FRAMEBUFFER, dest.buffer);
          dest = (dest == _fbo0) ? _fbo1 : _fbo0;
  
negative.code:   Texture texInit;
    final _fbo0;
    final _fbo1;
    FBO _fboTarget = null;
    ViewportPlan plan;
    FullScreenRectangle rectangle;
  
  