code: function (renderer, scene, camera, opts) {
  
          opts = opts || {};
          opts.renderToTarget = opts.renderToTarget || false;
          opts.notUpdateShadow = opts.notUpdateShadow || false;
          opts.notUpdateScene = opts.notUpdateScene || false;
  
          if (!opts.notUpdateScene) {
              scene.update(false, true);
          }
          scene.updateLights();
          // Render list will be updated in gbuffer.
  
          camera.update(true);
  
          // PENDING For stereo rendering
          var dpr = renderer.getDevicePixelRatio();
          if (this.autoResize
              && (renderer.getWidth() * dpr !== this._lightAccumTex.width
              || renderer.getHeight() * dpr !== this._lightAccumTex.height)
          ) {
              this.resize(renderer.getWidth() * dpr, renderer.getHeight() * dpr);
          }
  
          this._gBuffer.update(renderer, scene, camera);
  
          // Accumulate light buffer
          this._accumulateLightBuffer(renderer, scene, camera, !opts.notUpdateShadow);
  
          if (!opts.renderToTarget) {
              this._outputPass.setUniform('texture', this._lightAccumTex);
  
              this._outputPass.render(renderer);
              // this._gBuffer.renderDebug(renderer, camera, 'normal');
          }
      }
docs: Do render
  @param {clay.Renderer} renderer
  @param {clay.Scene} scene
  @param {clay.Camera} camera
  @param {Object} [opts]
  @param {boolean} [opts.renderToTarget = false] If not ouput and render to the target texture
  @param {boolean} [opts.notUpdateShadow = true] If not update the shadow.
  @param {boolean} [opts.notUpdateScene = true] If not update the scene.