ソースを参照

Render volumetric lights before bloom in standard rendering pipeline

Julien Moreau-Mathis 8 年 前
コミット
f7053dace0

+ 12 - 16
src/PostProcess/RenderPipeline/Pipelines/babylon.standardRenderingPipeline.ts

@@ -102,7 +102,6 @@
         private _currentDepthOfFieldSource: PostProcess = null;
         private _basePostProcess: PostProcess;
 
-        private _currentHDRSource: PostProcess = null;
         private _hdrCurrentLuminance: number = 1.0;
 
         private _floatTextureType: number;
@@ -278,6 +277,15 @@
 
             this._currentDepthOfFieldSource = this.originalPostProcess;
 
+            if (this._vlsEnabled) {
+                // Create volumetric light
+                this._createVolumetricLightPostProcess(scene, ratio);
+        
+                // Create volumetric light final post-process
+                this.volumetricLightFinalPostProcess = new PostProcess("HDRVLSFinal", "standard", [], [], ratio, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, "#define PASS_POST_PROCESS", Engine.TEXTURETYPE_UNSIGNED_INT);
+                this.addEffect(new PostProcessRenderEffect(scene.getEngine(), "HDRVLSFinal", () => { return this.volumetricLightFinalPostProcess; }, true));
+            }
+
             if (this._bloomEnabled) {
                 // Create down sample X4 post-process
                 this._createDownSampleX4PostProcess(scene, ratio / 2);
@@ -298,15 +306,6 @@
                 this.textureAdderFinalPostProcess = new PostProcess("HDRDepthOfFieldSource", "standard", [], [], ratio, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, "#define PASS_POST_PROCESS", Engine.TEXTURETYPE_UNSIGNED_INT);
                 this.addEffect(new PostProcessRenderEffect(scene.getEngine(), "HDRBaseDepthOfFieldSource", () => { return this.textureAdderFinalPostProcess; }, true));
             }
-        
-            if (this._vlsEnabled) {
-                // Create volumetric light
-                this._createVolumetricLightPostProcess(scene, ratio);
-        
-                // Create volumetric light final post-process
-                this.volumetricLightFinalPostProcess = new PostProcess("HDRVLSFinal", "standard", [], [], ratio, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, "#define PASS_POST_PROCESS", Engine.TEXTURETYPE_UNSIGNED_INT);
-                this.addEffect(new PostProcessRenderEffect(scene.getEngine(), "HDRVLSFinal", () => { return this.volumetricLightFinalPostProcess; }, true));
-            }
 
             if (this._lensFlareEnabled) {
                 // Create lens flare post-process
@@ -457,13 +456,12 @@
         private _createTextureAdderPostProcess(scene: Scene, ratio: number): void {
             this.textureAdderPostProcess = new PostProcess("HDRTextureAdder", "standard", ["exposure"], ["otherSampler", "lensSampler"], ratio, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, "#define TEXTURE_ADDER", Engine.TEXTURETYPE_UNSIGNED_INT);
             this.textureAdderPostProcess.onApply = (effect: Effect) => {
-                effect.setTextureFromPostProcess("otherSampler", this.originalPostProcess);
+                effect.setTextureFromPostProcess("otherSampler", this._vlsEnabled ? this._currentDepthOfFieldSource : this.originalPostProcess);
                 effect.setTexture("lensSampler", this.lensTexture);
 
                 effect.setFloat("exposure", this.exposure);
 
                 this._currentDepthOfFieldSource = this.textureAdderFinalPostProcess;
-                this._currentHDRSource = this.textureAdderFinalPostProcess;
             };
 
             // Add to pipeline
@@ -537,10 +535,9 @@
             this.volumetricLightMergePostProces = new PostProcess("HDRVLSMerge", "standard", [], ["originalSampler"], ratio, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, "#define VLSMERGE");
 
             this.volumetricLightMergePostProces.onApply = (effect: Effect) => {
-                effect.setTextureFromPostProcess("originalSampler", this._bloomEnabled ? this.textureAdderFinalPostProcess : this.originalPostProcess);
+                effect.setTextureFromPostProcess("originalSampler", this.originalPostProcess);
 
                 this._currentDepthOfFieldSource = this.volumetricLightFinalPostProcess;
-                this._currentHDRSource = this.volumetricLightFinalPostProcess;
             };
 
             this.addEffect(new PostProcessRenderEffect(scene.getEngine(), "HDRVLSMerge", () => { return this.volumetricLightMergePostProces; }, true));
@@ -632,7 +629,7 @@
             var lastTime = 0;
 
             this.hdrPostProcess.onApply = (effect: Effect) => {
-                effect.setTextureFromPostProcess("textureAdderSampler", this._bloomEnabled ? this._currentHDRSource : this.originalPostProcess);
+                effect.setTextureFromPostProcess("textureAdderSampler", this._currentDepthOfFieldSource);
 
                 time += scene.getEngine().getDeltaTime();
 
@@ -730,7 +727,6 @@
                 effect.setMatrix("lensStarMatrix", lensStarMatrix);
 
                 this._currentDepthOfFieldSource = this.lensFlareFinalPostProcess;
-                this._currentHDRSource = this.lensFlareFinalPostProcess;
             };
         }