|
@@ -26,6 +26,8 @@ module BABYLON {
|
|
|
private _depthOfFieldBlurY: Array<DepthOfFieldBlurPostProcess>;
|
|
|
private _depthOfFieldMerge: DepthOfFieldMergePostProcess;
|
|
|
|
|
|
+ private _effects: Array<PostProcess> = [];
|
|
|
+
|
|
|
/**
|
|
|
* The focal the length of the camera used in the effect
|
|
|
*/
|
|
@@ -71,59 +73,59 @@ module BABYLON {
|
|
|
*/
|
|
|
constructor(scene: Scene, depthTexture: RenderTargetTexture, blurLevel: DepthOfFieldEffectBlurLevel = DepthOfFieldEffectBlurLevel.Low, pipelineTextureType = 0) {
|
|
|
super(scene.getEngine(), "depth of field", ()=>{
|
|
|
- // 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);
|
|
|
- // Capture circle of confusion texture
|
|
|
- this._depthOfFieldPass = new PassPostProcess("depthOfFieldPass", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType);
|
|
|
- this._depthOfFieldPass.autoClear = false;
|
|
|
+ return this._effects;
|
|
|
+ }, 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);
|
|
|
+ // Capture circle of confusion texture
|
|
|
+ this._depthOfFieldPass = new PassPostProcess("depthOfFieldPass", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType);
|
|
|
+ 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
|
|
|
- // See section 2.6.2 http://fileadmin.cs.lth.se/cs/education/edan35/lectures/12dof.pdf
|
|
|
- this._depthOfFieldBlurY = []
|
|
|
- this._depthOfFieldBlurX = []
|
|
|
- var blurCount = 1;
|
|
|
- var kernelSize = 15;
|
|
|
- switch(blurLevel){
|
|
|
- case DepthOfFieldEffectBlurLevel.High: {
|
|
|
- blurCount = 3;
|
|
|
- kernelSize = 51;
|
|
|
- break;
|
|
|
- }
|
|
|
- case DepthOfFieldEffectBlurLevel.Medium: {
|
|
|
- blurCount = 2;
|
|
|
- kernelSize = 31;
|
|
|
- break;
|
|
|
- }
|
|
|
- default: {
|
|
|
- kernelSize = 15;
|
|
|
- blurCount = 1;
|
|
|
- break;
|
|
|
- }
|
|
|
+ // 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
|
|
|
+ // See section 2.6.2 http://fileadmin.cs.lth.se/cs/education/edan35/lectures/12dof.pdf
|
|
|
+ this._depthOfFieldBlurY = []
|
|
|
+ this._depthOfFieldBlurX = []
|
|
|
+ var blurCount = 1;
|
|
|
+ var kernelSize = 15;
|
|
|
+ switch(blurLevel){
|
|
|
+ case DepthOfFieldEffectBlurLevel.High: {
|
|
|
+ blurCount = 3;
|
|
|
+ kernelSize = 51;
|
|
|
+ break;
|
|
|
}
|
|
|
- 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);
|
|
|
- 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);
|
|
|
- blurX.autoClear = false;
|
|
|
- this._depthOfFieldBlurY.push(blurY);
|
|
|
- this._depthOfFieldBlurX.push(blurX);
|
|
|
+ case DepthOfFieldEffectBlurLevel.Medium: {
|
|
|
+ blurCount = 2;
|
|
|
+ kernelSize = 31;
|
|
|
+ break;
|
|
|
}
|
|
|
-
|
|
|
- // 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);
|
|
|
- this._depthOfFieldMerge.autoClear = false;
|
|
|
-
|
|
|
- // Set all post processes on the effect.
|
|
|
- var effects= [this._circleOfConfusion, this._depthOfFieldPass];
|
|
|
- for(var i=0;i<this._depthOfFieldBlurX.length;i++){
|
|
|
- effects.push(this._depthOfFieldBlurY[i]);
|
|
|
- effects.push(this._depthOfFieldBlurX[i]);
|
|
|
+ default: {
|
|
|
+ kernelSize = 15;
|
|
|
+ blurCount = 1;
|
|
|
+ break;
|
|
|
}
|
|
|
- effects.push(this._depthOfFieldMerge);
|
|
|
- return effects;
|
|
|
- }, true);
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ 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);
|
|
|
+ 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);
|
|
|
+ this._depthOfFieldMerge.autoClear = false;
|
|
|
+
|
|
|
+ // Set all post processes on the effect.
|
|
|
+ this._effects= [this._circleOfConfusion, this._depthOfFieldPass];
|
|
|
+ for(var i=0;i<this._depthOfFieldBlurX.length;i++){
|
|
|
+ this._effects.push(this._depthOfFieldBlurY[i]);
|
|
|
+ this._effects.push(this._depthOfFieldBlurX[i]);
|
|
|
+ }
|
|
|
+ this._effects.push(this._depthOfFieldMerge);
|
|
|
}
|
|
|
|
|
|
/**
|