|
@@ -20,7 +20,6 @@ module BABYLON {
|
|
|
* The depth of field effect applies a blur to objects that are closer or further from where the camera is focusing.
|
|
|
*/
|
|
|
export class DepthOfFieldEffect extends PostProcessRenderEffect{
|
|
|
- private _depthOfFieldPass: PassPostProcess;
|
|
|
private _circleOfConfusion: CircleOfConfusionPostProcess;
|
|
|
private _depthOfFieldBlurX: Array<DepthOfFieldBlurPostProcess>;
|
|
|
private _depthOfFieldBlurY: Array<DepthOfFieldBlurPostProcess>;
|
|
@@ -81,9 +80,6 @@ module BABYLON {
|
|
|
}, true);
|
|
|
// Circle of confusion value for each pixel is used to determine how much to blur that pixel
|
|
|
this._circleOfConfusion = new BABYLON.CircleOfConfusionPostProcess("circleOfConfusion", depthTexture, 1, null, BABYLON.Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
- // Capture circle of confusion texture
|
|
|
- this._depthOfFieldPass = new PassPostProcess("depthOfFieldPass", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
- this._depthOfFieldPass.autoClear = false;
|
|
|
|
|
|
// Create a pyramid of blurred images (eg. fullSize 1/4 blur, half size 1/2 blur, quarter size 3/4 blur, eith size 4/4 blur)
|
|
|
// Blur the image but do not blur on sharp far to near distance changes to avoid bleeding artifacts
|
|
@@ -111,20 +107,20 @@ module BABYLON {
|
|
|
}
|
|
|
var adjustedKernelSize = kernelSize/Math.pow(2, blurCount-1);
|
|
|
for(var i = 0;i<blurCount;i++){
|
|
|
- var blurY = new DepthOfFieldBlurPostProcess("verticle blur", scene, new Vector2(0, 1.0), adjustedKernelSize, 1.0/Math.pow(2, i), null, this._depthOfFieldPass, i == 0 ? this._circleOfConfusion : null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
+ var blurY = new DepthOfFieldBlurPostProcess("verticle blur", scene, new Vector2(0, 1.0), adjustedKernelSize, 1.0/Math.pow(2, i), null, this._circleOfConfusion, i == 0 ? this._circleOfConfusion : null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
blurY.autoClear = false;
|
|
|
- var blurX = new DepthOfFieldBlurPostProcess("horizontal blur", scene, new Vector2(1.0, 0), adjustedKernelSize, 1.0/Math.pow(2, i), null, this._depthOfFieldPass, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
+ var blurX = new DepthOfFieldBlurPostProcess("horizontal blur", scene, new Vector2(1.0, 0), adjustedKernelSize, 1.0/Math.pow(2, i), null, this._circleOfConfusion, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
blurX.autoClear = false;
|
|
|
this._depthOfFieldBlurY.push(blurY);
|
|
|
this._depthOfFieldBlurX.push(blurX);
|
|
|
}
|
|
|
|
|
|
// Merge blurred images with original image based on circleOfConfusion
|
|
|
- this._depthOfFieldMerge = new DepthOfFieldMergePostProcess("depthOfFieldMerge", this._circleOfConfusion, this._depthOfFieldPass, this._depthOfFieldBlurY.slice(1), 1, null, BABYLON.Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
+ this._depthOfFieldMerge = new DepthOfFieldMergePostProcess("depthOfFieldMerge", this._circleOfConfusion, this._circleOfConfusion, this._depthOfFieldBlurY.slice(0, this._depthOfFieldBlurY.length-1), 1, null, BABYLON.Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
|
|
|
this._depthOfFieldMerge.autoClear = false;
|
|
|
|
|
|
// Set all post processes on the effect.
|
|
|
- this._effects= [this._circleOfConfusion, this._depthOfFieldPass];
|
|
|
+ this._effects= [this._circleOfConfusion];
|
|
|
for(var i=0;i<this._depthOfFieldBlurX.length;i++){
|
|
|
this._effects.push(this._depthOfFieldBlurY[i]);
|
|
|
this._effects.push(this._depthOfFieldBlurX[i]);
|
|
@@ -144,7 +140,6 @@ module BABYLON {
|
|
|
* @param camera The camera to dispose the effect on.
|
|
|
*/
|
|
|
public disposeEffects(camera:Camera){
|
|
|
- this._depthOfFieldPass.dispose(camera);
|
|
|
this._circleOfConfusion.dispose(camera);
|
|
|
this._depthOfFieldBlurX.forEach(element => {
|
|
|
element.dispose(camera);
|