Benjamin Guignabert пре 4 година
родитељ
комит
05026c1f73

+ 14 - 0
src/Engines/Extensions/engine.multiRender.ts

@@ -49,8 +49,15 @@ declare module "../../Engines/thinEngine" {
 
         /**
          * Restores the webgl state to only draw on the main color attachment
+         * when the frame buffer associated is the canvas frame buffer
          */
         restoreSingleAttachment() : void;
+
+        /**
+         * Restores the webgl state to only draw on the main color attachment
+         * when the frame buffer associated is not the canvas frame buffer
+         */
+        restoreSingleAttachmentForRenderTarget() : void;
     }
 }
 
@@ -60,6 +67,13 @@ ThinEngine.prototype.restoreSingleAttachment = function(): void {
     this.bindAttachments([gl.BACK]);
 };
 
+
+ThinEngine.prototype.restoreSingleAttachmentForRenderTarget = function(): void {
+    const gl = this._gl;
+
+    this.bindAttachments([gl.COLOR_ATTACHMENT0]);
+};
+
 ThinEngine.prototype.buildTextureLayout = function(textureStatus: boolean[]): number[] {
     const gl = this._gl;
 

+ 2 - 2
src/Materials/Textures/prePassRenderTarget.ts

@@ -37,7 +37,7 @@ export class PrePassRenderTarget extends MultiRenderTarget {
     public _defaultAttachments: number[];
     public _clearAttachments: number[];
 
-    public _isDirty: boolean = false;
+    public _isDirty: boolean = true;
 
     public _beforeCompositionPostProcesses: PostProcess[] = [];
     /**
@@ -78,7 +78,7 @@ export class PrePassRenderTarget extends MultiRenderTarget {
 	    {
 	        type: Constants.PREPASS_POSITION_TEXTURE_TYPE,
 	        format: Constants.TEXTURETYPE_HALF_FLOAT,
-	    },z
+	    },
 	    {
 	        type: Constants.PREPASS_VELOCITY_TEXTURE_TYPE,
 	        format: Constants.TEXTURETYPE_HALF_FLOAT,

+ 1 - 1
src/Materials/materialHelper.ts

@@ -348,7 +348,7 @@ export class MaterialHelper {
             index: "PREPASS_DEPTHNORMAL_INDEX",
         }];
 
-        if (scene.prePassRenderer && scene.prePassRenderer.enabled && canRenderToMRT) {
+        if (scene.prePassRenderer && scene.prePassRenderer.enabled && scene.prePassRenderer.getRenderTarget().enabled && canRenderToMRT) {
             defines.PREPASS = true;
             defines.SCENE_MRT_COUNT = scene.prePassRenderer.getRenderTarget().mrtCount;
 

+ 5 - 4
src/Rendering/prePassRenderer.ts

@@ -99,12 +99,12 @@ export class PrePassRenderer {
         this._engine = scene.getEngine();
 
         PrePassRenderer._SceneComponentInitialization(this._scene);
-        this.defaultRT = this._createRenderTarget();
+        this.defaultRT = this._createRenderTarget("sceneprePassRT");
         this._setRenderTarget(null);
     }
 
-    public _createRenderTarget() : PrePassRenderTarget {
-        const rt = new PrePassRenderTarget("sceneprePassRT", this, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene,
+    public _createRenderTarget(name: string) : PrePassRenderTarget {
+        const rt = new PrePassRenderTarget(name, this, { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, 0, this._scene,
             { generateMipMaps: false, generateDepthTexture: true, defaultType: Constants.TEXTURETYPE_UNSIGNED_INT, types: [] });
         rt.samples = 1;
 
@@ -168,10 +168,11 @@ export class PrePassRenderer {
             // Prepass disabled, we render only on 1 color attachment
             if (texture) {
                 texture._bindFrameBuffer();
+                this._engine.restoreSingleAttachmentForRenderTarget();
             } else {
                 this._engine.restoreDefaultFramebuffer();
+                this._engine.restoreSingleAttachment();
             }
-            this._engine.restoreSingleAttachment();
 
             return;
         }

+ 1 - 1
src/Rendering/prePassRendererSceneComponent.ts

@@ -120,7 +120,7 @@ export class PrePassRendererSceneComponent implements ISceneComponent {
     private _beforeRenderTargetDraw(renderTarget: RenderTargetTexture) {
         if (this.scene.prePassRenderer) {
             if (!renderTarget._prePassRenderTarget) {
-                renderTarget._prePassRenderTarget = this.scene.prePassRenderer._createRenderTarget();
+                renderTarget._prePassRenderTarget = this.scene.prePassRenderer._createRenderTarget(renderTarget.name + "_prePassRTT");
             }
             this.scene.prePassRenderer._setRenderTarget(renderTarget._prePassRenderTarget);
             this.scene.prePassRenderer._clear();