소스 검색

removing prepass calls from mesh render

Benjamin Guignabert 4 년 전
부모
커밋
c93f02ba34
3개의 변경된 파일33개의 추가작업 그리고 16개의 파일을 삭제
  1. 5 15
      src/Meshes/mesh.ts
  2. 26 0
      src/Rendering/prePassRendererSceneComponent.ts
  3. 2 1
      src/sceneComponent.ts

+ 5 - 15
src/Meshes/mesh.ts

@@ -1861,10 +1861,6 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
             engine.setAlphaMode(this._effectiveMaterial.alphaMode);
         }
 
-        for (let step of scene._beforeRenderingMeshStage) {
-            step.action(this, subMesh, batch);
-        }
-
         var effect: Nullable<Effect>;
         if (this._effectiveMaterial._storeEffectOnSubMeshes) {
             effect = subMesh.effect;
@@ -1872,13 +1868,12 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
             effect = this._effectiveMaterial.getEffect();
         }
 
-        if (!effect) {
-            return this;
+        for (let step of scene._beforeRenderingMeshStage) {
+            step.action(this, subMesh, batch, effect);
         }
 
-        // Render to MRT
-        if (scene.prePassRenderer) {
-            scene.prePassRenderer.bindAttachmentsForEffect(effect, subMesh);
+        if (!effect) {
+            return this;
         }
 
         const effectiveMesh = effectiveMeshReplacement || this._effectiveMesh;
@@ -1937,13 +1932,8 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
         // Unbind
         this._effectiveMaterial.unbind();
 
-        // Restores default attachments
-        if (scene.prePassRenderer) {
-            scene.prePassRenderer.restoreAttachments();
-        }
-
         for (let step of scene._afterRenderingMeshStage) {
-            step.action(this, subMesh, batch);
+            step.action(this, subMesh, batch, effect);
         }
 
         if (this._internalMeshDataInfo._onAfterRenderObservable) {

+ 26 - 0
src/Rendering/prePassRendererSceneComponent.ts

@@ -3,6 +3,10 @@ import { Scene } from "../scene";
 import { ISceneComponent, SceneComponentConstants } from "../sceneComponent";
 import { PrePassRenderer } from "./prePassRenderer";
 import { Logger } from "../Misc/logger";
+import { AbstractMesh } from "../Meshes/abstractMesh";
+import { SubMesh } from "../Meshes/subMesh";
+import { _InstancesBatch } from "../Meshes/mesh";
+import { Effect } from "../Materials/effect";
 
 declare module "../abstractScene" {
     export interface AbstractScene {
@@ -96,6 +100,8 @@ export class PrePassRendererSceneComponent implements ISceneComponent {
         this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_PREPASS, this, this._beforeCameraDraw);
         this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS, this, this._afterCameraDraw);
         this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEARSTAGE_PREPASS, this, this._beforeClearStage);
+        this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORECLEARSTAGE_PREPASS, this, this._beforeRenderingMeshStage);
+        this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORECLEARSTAGE_PREPASS, this, this._afterRenderingMeshStage);
     }
 
     private _beforeCameraDraw() {
@@ -116,6 +122,26 @@ export class PrePassRendererSceneComponent implements ISceneComponent {
         }
     }
 
+    private _beforeRenderingMeshStage(mesh: AbstractMesh, subMesh: SubMesh, batch: _InstancesBatch, effect: Nullable<Effect>) {
+        if (!effect) {
+            return;
+        }
+
+        // Render to MRT
+        const scene = mesh.getScene();
+        if (scene.prePassRenderer) {
+            scene.prePassRenderer.bindAttachmentsForEffect(effect, subMesh);
+        }
+    }
+
+    private _afterRenderingMeshStage(mesh: AbstractMesh) {
+        const scene = mesh.getScene();
+        
+        if (scene.prePassRenderer) {
+            scene.prePassRenderer.restoreAttachments();
+        }
+    }
+
     /**
      * Rebuilds the elements related to this component in case of
      * context lost for instance.

+ 2 - 1
src/sceneComponent.ts

@@ -10,6 +10,7 @@ import { PickingInfo } from "./Collisions/pickingInfo";
 import { AbstractScene } from "./abstractScene";
 
 declare type Mesh = import("./Meshes/mesh").Mesh;
+declare type Effect = import("./Materials/effect").Effect;
 
 /**
  * Groups all the scene component constants in one place to ease maintenance.
@@ -186,7 +187,7 @@ export type RenderingGroupStageAction = (renderingGroupId: number) => void;
 /**
  * Strong typing of a Mesh Render related stage step action
  */
-export type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch) => void;
+export type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch, effect: Nullable<Effect>) => void;
 
 /**
  * Strong typing of a simple stage step action