function SSAO2RenderingPipeline(name, scene, ratio, cameras) {
            var _this = _super.call(this, scene.getEngine(), name) || this;
            // Members
            /**
            * The PassPostProcess id in the pipeline that contains the original scene color
            * @type {string}
            */
            _this.SSAOOriginalSceneColorEffect = "SSAOOriginalSceneColorEffect";
            /**
            * The SSAO PostProcess id in the pipeline
            * @type {string}
            */
            _this.SSAORenderEffect = "SSAORenderEffect";
            /**
            * The horizontal blur PostProcess id in the pipeline
            * @type {string}
            */
            _this.SSAOBlurHRenderEffect = "SSAOBlurHRenderEffect";
            /**
            * The vertical blur PostProcess id in the pipeline
            * @type {string}
            */
            _this.SSAOBlurVRenderEffect = "SSAOBlurVRenderEffect";
            /**
            * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
            * @type {string}
            */
            _this.SSAOCombineRenderEffect = "SSAOCombineRenderEffect";
            /**
            * The output strength of the SSAO post-process. Default value is 1.0.
            * @type {number}
            */
            _this.totalStrength = 1.0;
            /**
            * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.
            * @type {number}
            */
            _this.maxZ = 100.0;
            /**
            * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much
            * @type {number}
            */
            _this.minZAspect = 0.2;
            /**
            * Number of samples used for the SSAO calculations. Default value is 8
            * @type {number}
            */
            _this._samples = 8;
            /**
            * Are we using bilateral blur ?
            * @type {boolean}
            */
            _this._expensiveBlur = true;
            /**
            * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0
            * @type {number}
            */
            _this.radius = 2.0;
            /**
            * The base color of the SSAO post-process
            * The final result is "base + ssao" between [0, 1]
            * @type {number}
            */
            _this.base = 0.1;
            _this._firstUpdate = true;
            _this._scene = scene;
            if (!_this.isSupported) {
                BABYLON.Tools.Error("SSAO 2 needs WebGL 2 support.");
                return _this;
            }
            var ssaoRatio = ratio.ssaoRatio || ratio;
            var blurRatio = ratio.blurRatio || ratio;
            // Set up assets
            var geometryBufferRenderer = scene.enableGeometryBufferRenderer();
            _this._createRandomTexture();
            _this._depthTexture = geometryBufferRenderer.getGBuffer().textures[0];
            _this._normalTexture = geometryBufferRenderer.getGBuffer().textures[1];
            _this._originalColorPostProcess = new BABYLON.PassPostProcess("SSAOOriginalSceneColor", 1.0, null, BABYLON.Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false);
            _this._createSSAOPostProcess(1.0);
            _this._createBlurPostProcess(ssaoRatio, blurRatio);
            _this._createSSAOCombinePostProcess(blurRatio);
            // Set up pipeline
            _this.addEffect(new BABYLON.PostProcessRenderEffect(scene.getEngine(), _this.SSAOOriginalSceneColorEffect, function () { return _this._originalColorPostProcess; }, true));
            _this.addEffect(new BABYLON.PostProcessRenderEffect(scene.getEngine(), _this.SSAORenderEffect, function () { return _this._ssaoPostProcess; }, true));
            _this.addEffect(new BABYLON.PostProcessRenderEffect(scene.getEngine(), _this.SSAOBlurHRenderEffect, function () { return _this._blurHPostProcess; }, true));
            _this.addEffect(new BABYLON.PostProcessRenderEffect(scene.getEngine(), _this.SSAOBlurVRenderEffect, function () { return _this._blurVPostProcess; }, true));
            _this.addEffect(new BABYLON.PostProcessRenderEffect(scene.getEngine(), _this.SSAOCombineRenderEffect, function () { return _this._ssaoCombinePostProcess; }, true));
            // Finish
            scene.postProcessRenderPipelineManager.addPipeline(_this);
            if (cameras)
                scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(name, cameras);
            return _this;
        }
@constructor
@param {string} name - The rendering pipeline name
@param {BABYLON.Scene} scene - The scene linked to this pipeline
@param {any} ratio - The size of the postprocesses. Can be a number shared between passes or an object for more precision: { ssaoRatio: 0.5, blurRatio: 1.0 }
@param {BABYLON.Camera[]} cameras - The array of cameras that the rendering pipeline will be attached to