anchor.diff:      }
       gl.bindFramebuffer(FRAMEBUFFER, null);
     }
  +
  +  dispose() {
  +    _fbo0.dispose();
  +    _fbo1.dispose();
  +//    filters.forEach((x){
  +//      x.ctx.delete();
  +//    });
  +    filters.clear();
  +  }
   }
  
positive.code:   Texture texInit;
    final _fbo0;
    final _fbo1;
    ViewportPlan plan;
    FullScreenRectangle rectangle;
  
  
negative.code:     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);
      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){
  