ソースを参照

init link geo buffer

Benjamin Guignabert 4 年 前
コミット
c9b76a3937
2 ファイル変更50 行追加2 行削除
  1. 1 1
      src/Meshes/mesh.ts
  2. 49 1
      src/Rendering/prePassRenderer.ts

+ 1 - 1
src/Meshes/mesh.ts

@@ -1878,7 +1878,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
 
         // Render to MRT
         if (scene.prePassRenderer) {
-            scene.prePassRenderer.bindAttachmentsForEffect(effect);
+            scene.prePassRenderer.bindAttachmentsForEffect(effect, subMesh);
         }
 
         const effectiveMesh = effectiveMeshReplacement || this._effectiveMesh;

+ 49 - 1
src/Rendering/prePassRenderer.ts

@@ -11,6 +11,8 @@ import { PrePassEffectConfiguration } from "./prePassEffectConfiguration";
 import { Nullable } from "../types";
 import { AbstractMesh } from '../Meshes/abstractMesh';
 import { Material } from '../Materials/material';
+import { SubMesh } from '../Meshes/subMesh';
+import { GeometryBufferRenderer } from '../Rendering/geometryBufferRenderer';
 
 /**
  * Renders a pre pass of the scene
@@ -60,6 +62,13 @@ export class PrePassRenderer {
      */
     public excludedSkinnedMesh: AbstractMesh[] = [];
 
+    /**
+     * Force material to be excluded from the prepass
+     * Can be useful when `useGeometryBufferFallback` is set to `true`
+     * and you don't want a material to show in the effect.
+     */
+    public excludedMaterials: Material[] = [];
+
     private _textureIndices: number[] = [];
 
     private _scene: Scene;
@@ -121,6 +130,34 @@ export class PrePassRenderer {
         this.prePassRT.samples = n;
     }
 
+    private _geometryBuffer: Nullable<GeometryBufferRenderer>;
+    private _useGeometryBufferFallback = false;
+    /**
+     * Uses the geometry buffer renderer as a fallback for non prepass capable effects
+     */
+    public get useGeometryBufferFallback() : boolean {
+        return this._useGeometryBufferFallback;
+    }
+
+    public set useGeometryBufferFallback(value: boolean) {
+        this._useGeometryBufferFallback = value;
+
+        if (value) {
+            this._geometryBuffer = this._scene.enableGeometryBufferRenderer();
+
+            if (!this._geometryBuffer) {
+                // Not supported
+                this._useGeometryBufferFallback = false;
+                return;
+            }
+
+            this._geometryBuffer.renderList = [];
+        } else {
+            this._geometryBuffer = null;
+            this._scene.disableGeometryBufferRenderer();
+        }
+    }
+
     /**
      * Instanciates a prepass renderer
      * @param scene The scene
@@ -171,12 +208,19 @@ export class PrePassRenderer {
      * Sets the proper output textures to draw in the engine.
      * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.
      */
-    public bindAttachmentsForEffect(effect: Effect) {
+    public bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh) {
         if (this.enabled) {
             if (effect._multiTarget) {
                 this._engine.bindAttachments(this._multiRenderAttachments);
             } else {
                 this._engine.bindAttachments(this._defaultAttachments);
+
+                if (this._geometryBuffer) {
+                    const material = subMesh.getMaterial();
+                    if (material && this.excludedMaterials.indexOf(material) === -1) {
+                        this._geometryBuffer.renderList.push(subMesh.getRenderingMesh());
+                    }
+                }
             }
         }
     }
@@ -189,6 +233,10 @@ export class PrePassRenderer {
             this._update();
         }
 
+        if (this._geometryBuffer) {
+            this._geometryBuffer.renderList = [];
+        }
+
         this._bindFrameBuffer();
     }