Benjamin Guignabert 4 лет назад
Родитель
Сommit
933dae05f3
1 измененных файлов с 17 добавлено и 7 удалено
  1. 17 7
      src/Rendering/prePassRenderer.ts

+ 17 - 7
src/Rendering/prePassRenderer.ts

@@ -333,13 +333,15 @@ export class PrePassRenderer {
      * @hidden
      * @hidden
      */
      */
     public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {
     public _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number) {
+        const previousEnabled = this._enabled && this._currentTarget.enabled;
+
         if (this._isDirty) {
         if (this._isDirty) {
             this._update();
             this._update();
         }
         }
 
 
         const texture = this._currentTarget.renderTargetTexture;
         const texture = this._currentTarget.renderTargetTexture;
 
 
-        if (!this._enabled || !this._currentTarget.enabled) {
+        if (previousEnabled && (!this._enabled || !this._currentTarget.enabled)) {
             // Prepass disabled, we render only on 1 color attachment
             // Prepass disabled, we render only on 1 color attachment
             if (texture) {
             if (texture) {
                 texture._prepareFrame(this._scene, faceIndex, layer, texture.useCameraPostProcesses);
                 texture._prepareFrame(this._scene, faceIndex, layer, texture.useCameraPostProcesses);
@@ -432,16 +434,15 @@ export class PrePassRenderer {
 
 
     private _setState(enabled: boolean) {
     private _setState(enabled: boolean) {
         this._enabled = enabled;
         this._enabled = enabled;
+    }
 
 
-        // TODO : enable/disable per texture
+    private _setRenderTargetState(prePassRenderTarget: PrePassRenderTarget, enabled: boolean) {
         for (let i = 0; i < this.renderTargets.length; i++) {
         for (let i = 0; i < this.renderTargets.length; i++) {
-            const prePassRenderTarget = this.renderTargets[i];
-
             prePassRenderTarget.enabled = enabled;
             prePassRenderTarget.enabled = enabled;
 
 
             if (prePassRenderTarget.imageProcessingPostProcess) {
             if (prePassRenderTarget.imageProcessingPostProcess) {
                 prePassRenderTarget.imageProcessingPostProcess.imageProcessingConfiguration.applyByPostProcess = enabled;
                 prePassRenderTarget.imageProcessingPostProcess.imageProcessingConfiguration.applyByPostProcess = enabled;
-            }
+            }  
         }
         }
     }
     }
 
 
@@ -508,6 +509,10 @@ export class PrePassRenderer {
     private _disable() {
     private _disable() {
         this._setState(false);
         this._setState(false);
 
 
+        for (let i = 0; i < this.renderTargets.length; i++) {
+            this._setRenderTargetState(this.renderTargets[i], false);
+        }
+
         this._resetLayout();
         this._resetLayout();
 
 
         for (let i = 0; i < this._effectConfigurations.length; i++) {
         for (let i = 0; i < this._effectConfigurations.length; i++) {
@@ -634,6 +639,10 @@ export class PrePassRenderer {
         for (let i = 0; i < this._scene.materials.length; i++) {
         for (let i = 0; i < this._scene.materials.length; i++) {
             if (this._scene.materials[i].setPrePassRenderer(this)) {
             if (this._scene.materials[i].setPrePassRenderer(this)) {
                 enablePrePass = true;
                 enablePrePass = true;
+
+                for (let j = 0; j < this.renderTargets.length; j++) {
+                    this._setRenderTargetState(this.renderTargets[j], true);
+                }
             }
             }
         }
         }
 
 
@@ -658,8 +667,9 @@ export class PrePassRenderer {
             postProcesses = (<Nullable<PostProcess[]>>postProcesses.filter((pp) => { return pp != null; }));
             postProcesses = (<Nullable<PostProcess[]>>postProcesses.filter((pp) => { return pp != null; }));
 
 
             if (postProcesses) {
             if (postProcesses) {
-                for (let i = 0; i < postProcesses.length; i++) {
-                    if (postProcesses[i].setPrePassRenderer(this)) {
+                for (let j = 0; j < postProcesses.length; j++) {
+                    if (postProcesses[j].setPrePassRenderer(this)) {
+                        this._setRenderTargetState(this.renderTargets[i], true);
                         enablePrePass = true;
                         enablePrePass = true;
                     }
                     }
                 }
                 }