Browse Source

adding variable indices, still WIP in the shader

Benjamin Guignabert 5 years ago
parent
commit
70e208a001

+ 5 - 2
src/Rendering/prePassEffectConfiguration.ts

@@ -8,12 +8,15 @@ export interface PrePassEffectConfiguration {
      * Name of the effect
      */
     name: string;
-
     /**
      * Post process to attach for this effect
      */
     postProcess: PostProcess;
     /**
+     * Textures required in the MRT
+     */
+    texturesRequired: number[];
+    /**
      * Is the effect enabled
      */
     enabled: boolean;
@@ -22,7 +25,7 @@ export interface PrePassEffectConfiguration {
      */
     dispose(): void;
     /**
-     * Disposes the effect configuration
+     * Creates the associated post process
      */
     createPostProcess: () => PostProcess;
 }

+ 63 - 29
src/Rendering/prePassRenderer.ts

@@ -59,15 +59,36 @@ export class PrePassRenderer {
      */
     public static readonly ALBEDO_TEXTURE_TYPE = 6;
 
-    private _textureTypes = [
-        PrePassRenderer.IRRADIANCE_TEXTURE_TYPE,
-        PrePassRenderer.POSITION_TEXTURE_TYPE,
-        PrePassRenderer.VELOCITY_TEXTURE_TYPE,
-        PrePassRenderer.REFLECTIVITY_TEXTURE_TYPE,
-        PrePassRenderer.COLOR_TEXTURE_TYPE,
-        PrePassRenderer.DEPTHNORMAL_TEXTURE_TYPE,
-        PrePassRenderer.ALBEDO_TEXTURE_TYPE,
-    ];
+    private _textureFormats = [
+        {
+            type: PrePassRenderer.IRRADIANCE_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: PrePassRenderer.POSITION_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: PrePassRenderer.VELOCITY_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: PrePassRenderer.REFLECTIVITY_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_UNSIGNED_INT,
+        },
+        {
+            type: PrePassRenderer.COLOR_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: PrePassRenderer.DEPTHNORMAL_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: PrePassRenderer.ALBEDO_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_UNSIGNED_INT,
+        },
+];
 
     private _textureIndices: number[] = [];
 
@@ -78,18 +99,13 @@ export class PrePassRenderer {
     /**
      * Number of textures in the multi render target texture where the scene is directly rendered
      */
-    public readonly mrtCount: number = 4;
+    public mrtCount: number = 0;
 
     /**
      * The render target where the scene is directly rendered
      */
     public prePassRT: MultiRenderTarget;
-    private _mrtTypes = [
-        Constants.TEXTURETYPE_HALF_FLOAT, // Original color
-        Constants.TEXTURETYPE_HALF_FLOAT, // Irradiance
-        Constants.TEXTURETYPE_HALF_FLOAT, // Depth (world units)
-        Constants.TEXTURETYPE_UNSIGNED_INT // Albedo
-    ];
+
     private _multiRenderAttachments: number[];
     private _defaultAttachments: number[];
     private _clearAttachments: number[];
@@ -118,6 +134,7 @@ export class PrePassRenderer {
      */
     public materialsShouldRenderIrradiance: boolean = false;
 
+    private _mrtFormats: number[] = [];
     private _mrtLayout: number[];
 
     private _enabled: boolean = false;
@@ -174,7 +191,7 @@ export class PrePassRenderer {
 
     private _createCompositionEffect() {
         this.prePassRT = new MultiRenderTarget("sceneprePassRT", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, this.mrtCount, this._scene,
-            { generateMipMaps: false, generateDepthTexture: true, defaultType: Constants.TEXTURETYPE_UNSIGNED_INT, types: this._mrtTypes });
+            { generateMipMaps: false, generateDepthTexture: true, defaultType: Constants.TEXTURETYPE_UNSIGNED_INT, types: this._mrtFormats });
         this.prePassRT.samples = 1;
 
         this._initializeAttachments();
@@ -280,6 +297,16 @@ export class PrePassRenderer {
         }
     }
 
+    private _checkTextureType(type: number) : boolean {
+        if (type < 0 || type >= this._textureFormats.length) {
+            Logger.Error("PrePassRenderer : Unknown texture type");
+            return false;
+        }
+
+        return true;
+
+    }
+
     /**
      * Adds an effect configuration
      */
@@ -300,8 +327,7 @@ export class PrePassRenderer {
      * @return The index
      */
     public getIndex(type: number) : number {
-        if (this._textureTypes.indexOf(type) === -1) {
-            Logger.Error("PrePassRenderer : Unknown texture type");
+        if (!this._checkTextureType(type)) {
             return -1;
         }
 
@@ -315,6 +341,7 @@ export class PrePassRenderer {
             if (this._effectConfigurations[i].enabled) {
                 if (!this._effectConfigurations[i].postProcess) {
                     this._effectConfigurations[i].createPostProcess();
+                    this._enableTextures(this._effectConfigurations[i].texturesRequired);
                 }
 
                 this._postProcesses.push(this._effectConfigurations[i].postProcess);
@@ -343,12 +370,14 @@ export class PrePassRenderer {
     }
 
     private _resetLayout() {
-        for (let i = 0 ; i < this._textureTypes.length; i++) {
-            this._textureIndices[this._textureTypes[i]] = -1;
+        for (let i = 0 ; i < this._textureFormats.length; i++) {
+            this._textureIndices[this._textureFormats[i].type] = -1;
         }
 
         this._textureIndices[PrePassRenderer.COLOR_TEXTURE_TYPE] = 0;
         this._mrtLayout = [PrePassRenderer.COLOR_TEXTURE_TYPE];
+        this._mrtFormats = [Constants.TEXTURETYPE_HALF_FLOAT];
+        this.mrtCount = 1;
     }
 
     private _resetPostProcessChain() {
@@ -378,15 +407,20 @@ export class PrePassRenderer {
     /**
      * Enables a texture on the MultiRenderTarget for prepass
      */
-    public enableTexture(type: number) {
-        if (this._textureTypes.indexOf(type) === -1) {
-            Logger.Error("PrePassRenderer : Unknown texture type");
-            return;
-        }
+    private _enableTextures(types: number[]) {
+        for (let i = 0; i < types.length; i++) {
+            let type = types[i];
+            if (!this._checkTextureType(type)) {
+                return;
+            }
+
+            if (this._textureIndices[type] === -1) {
+                this._textureIndices[type] = this._mrtLayout.length;
+                this._mrtLayout.push(type);
 
-        if (this._textureIndices[type] === -1) {
-            this._textureIndices[type] = this._mrtLayout.length;
-            this._mrtLayout.push(type);
+                this._mrtFormats.push(this._textureFormats[type].format);
+                this.mrtCount++;
+            }
         }
     }
 

+ 11 - 0
src/Rendering/subSurfaceConfiguration.ts

@@ -2,6 +2,7 @@ import { Logger } from "../Misc/logger";
 import { Scene } from "../scene";
 import { Color3 } from "../Maths/math.color";
 import { SubSurfaceScatteringPostProcess } from "../PostProcesses/subSurfaceScatteringPostProcess";
+import { PrePassRenderer } from "./prePassRenderer";
 import { SceneComponentConstants } from "../sceneComponent";
 import { PrePassEffectConfiguration } from "./prePassEffectConfiguration";
 import { _DevTools } from '../Misc/devTools';
@@ -70,6 +71,16 @@ export class SubSurfaceConfiguration implements PrePassEffectConfiguration {
      */
     public metersPerUnit: number = 1;
 
+    /**
+     * Textures that should be present in the MRT for this effect to work
+     */
+    public readonly texturesRequired: number[] = [
+        PrePassRenderer.COLOR_TEXTURE_TYPE,
+        PrePassRenderer.IRRADIANCE_TEXTURE_TYPE,
+        PrePassRenderer.DEPTHNORMAL_TEXTURE_TYPE,
+        PrePassRenderer.ALBEDO_TEXTURE_TYPE,
+    ];
+
     private _scene: Scene;
 
     /**