Forráskód Böngészése

split normal/depth in prepass layout

Benjamin Guignabert 4 éve
szülő
commit
ba037a0873

+ 9 - 4
src/Engines/constants.ts

@@ -515,13 +515,18 @@ export class Constants {
      */
     public static readonly PREPASS_COLOR_TEXTURE_TYPE = 4;
     /**
-     * Constant used to retrieve depth + normal index in the textures array in the prepass
-     * using the getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)
+     * Constant used to retrieve depth index in the textures array in the prepass
+     * using the getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)
      */
-    public static readonly PREPASS_DEPTHNORMAL_TEXTURE_TYPE = 5;
+    public static readonly PREPASS_DEPTH_TEXTURE_TYPE = 5;
+    /**
+     * Constant used to retrieve normal index in the textures array in the prepass
+     * using the getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)
+     */
+    public static readonly PREPASS_NORMAL_TEXTURE_TYPE = 6;
     /**
      * Constant used to retrieve albedo index in the textures array in the prepass
      * using the getIndex(Constants.PREPASS_ALBEDO_TEXTURE_TYPE)
      */
-    public static readonly PREPASS_ALBEDO_TEXTURE_TYPE = 6;
+    public static readonly PREPASS_ALBEDO_TEXTURE_TYPE = 7;
 }

+ 4 - 2
src/Materials/PBR/pbrBaseMaterial.ts

@@ -169,8 +169,10 @@ export class PBRMaterialDefines extends MaterialDefines
     public PREPASS_IRRADIANCE_INDEX = -1;
     public PREPASS_ALBEDO = false;
     public PREPASS_ALBEDO_INDEX = -1;
-    public PREPASS_DEPTHNORMAL = false;
-    public PREPASS_DEPTHNORMAL_INDEX = -1;
+    public PREPASS_DEPTH = false;
+    public PREPASS_DEPTH_INDEX = -1;
+    public PREPASS_NORMAL = false;
+    public PREPASS_NORMAL_INDEX = -1;
     public PREPASS_POSITION = false;
     public PREPASS_POSITION_INDEX = -1;
     public PREPASS_VELOCITY = false;

+ 8 - 3
src/Materials/materialHelper.ts

@@ -343,9 +343,14 @@ export class MaterialHelper {
             index: "PREPASS_ALBEDO_INDEX",
         },
         {
-            type: Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE,
-            define: "PREPASS_DEPTHNORMAL",
-            index: "PREPASS_DEPTHNORMAL_INDEX",
+            type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,
+            define: "PREPASS_DEPTH",
+            index: "PREPASS_DEPTH_INDEX",
+        },
+        {
+            type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,
+            define: "PREPASS_NORMAL",
+            index: "PREPASS_NORMAL_INDEX",
         }];
 
         if (scene.prePassRenderer && scene.prePassRenderer.enabled && canRenderToMRT) {

+ 4 - 2
src/Materials/standardMaterial.ts

@@ -132,8 +132,10 @@ export class StandardMaterialDefines extends MaterialDefines implements IImagePr
     public PREPASS_IRRADIANCE_INDEX = -1;
     public PREPASS_ALBEDO = false;
     public PREPASS_ALBEDO_INDEX = -1;
-    public PREPASS_DEPTHNORMAL = false;
-    public PREPASS_DEPTHNORMAL_INDEX = -1;
+    public PREPASS_DEPTH = false;
+    public PREPASS_DEPTH_INDEX = -1;
+    public PREPASS_NORMAL = false;
+    public PREPASS_NORMAL_INDEX = -1;
     public PREPASS_POSITION = false;
     public PREPASS_POSITION_INDEX = -1;
     public PREPASS_VELOCITY = false;

+ 11 - 20
src/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.ts

@@ -131,9 +131,9 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
     */
     public set expensiveBlur(b: boolean) {
         this._blurHPostProcess.updateEffect("#define BILATERAL_BLUR\n#define BILATERAL_BLUR_H\n#define SAMPLES 16\n#define EXPENSIVE " + (b ? "1" : "0") + "\n",
-            null, ["textureSampler", "depthNormalSampler"]);
+            null, ["textureSampler", "depthSampler"]);
         this._blurVPostProcess.updateEffect("#define BILATERAL_BLUR\n#define SAMPLES 16\n#define EXPENSIVE " + (b ? "1" : "0") + "\n",
-            null, ["textureSampler", "depthNormalSampler"]);
+            null, ["textureSampler", "depthSampler"]);
         this._expensiveBlur = b;
     }
 
@@ -278,7 +278,7 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
             this._samplerOffsets.push(i * 2 + 0.5);
         }
 
-        this._blurHPostProcess = new PostProcess("BlurH", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthNormalSampler"], ssaoRatio, null, Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_H\n#define SAMPLES 16\n#define EXPENSIVE " + (expensive ? "1" : "0") + "\n");
+        this._blurHPostProcess = new PostProcess("BlurH", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthSampler"], ssaoRatio, null, Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_H\n#define SAMPLES 16\n#define EXPENSIVE " + (expensive ? "1" : "0") + "\n");
         this._blurHPostProcess.onApply = (effect: Effect) => {
             if (!this._scene.activeCamera) {
                 return;
@@ -289,14 +289,14 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
             effect.setFloat("far", this._scene.activeCamera.maxZ);
             effect.setFloat("radius", this.radius);
             if (this._forceGeometryBuffer) {
-                effect.setTexture("depthNormalSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[0]);
+                effect.setTexture("depthSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[0]);
             } else {
-                effect.setTexture("depthNormalSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)]);
+                effect.setTexture("depthSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);
             }
             effect.setArray("samplerOffsets", this._samplerOffsets);
         };
 
-        this._blurVPostProcess = new PostProcess("BlurV", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthNormalSampler"], blurRatio, null, Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_V\n#define SAMPLES 16\n#define EXPENSIVE " + (expensive ? "1" : "0") + "\n");
+        this._blurVPostProcess = new PostProcess("BlurV", "ssao2", ["outSize", "samplerOffsets", "near", "far", "radius"], ["depthSampler"], blurRatio, null, Texture.TRILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, "#define BILATERAL_BLUR\n#define BILATERAL_BLUR_V\n#define SAMPLES 16\n#define EXPENSIVE " + (expensive ? "1" : "0") + "\n");
         this._blurVPostProcess.onApply = (effect: Effect) => {
             if (!this._scene.activeCamera) {
                 return;
@@ -307,9 +307,9 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
             effect.setFloat("far", this._scene.activeCamera.maxZ);
             effect.setFloat("radius", this.radius);
             if (this._forceGeometryBuffer) {
-                effect.setTexture("depthNormalSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[0]);
+                effect.setTexture("depthSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[0]);
             } else {
-                effect.setTexture("depthNormalSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)]);
+                effect.setTexture("depthSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);
             }
             effect.setArray("samplerOffsets", this._samplerOffsets);
 
@@ -373,10 +373,6 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
     private _getDefinesForSSAO() {
         let defines = "#define SAMPLES " + this.samples + "\n#define SSAO";
 
-        if (this._forceGeometryBuffer) {
-            defines = defines + "\n#define GEOMETRYBUFFER";
-        }
-
         return defines;
     }
 
@@ -384,13 +380,7 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
         this._sampleSphere = this._generateHemisphere();
 
         const defines = this._getDefinesForSSAO();
-        let samplers;
-
-        if (this._forceGeometryBuffer) {
-            samplers = ["randomSampler", "depthSampler", "normalSampler"];
-        } else {
-            samplers = ["randomSampler", "depthNormalSampler"];
-        }
+        const samplers = ["randomSampler", "depthSampler", "normalSampler"];
 
         this._ssaoPostProcess = new PostProcess("ssao2", "ssao2",
             [
@@ -427,7 +417,8 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
                 effect.setTexture("depthSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[0]);
                 effect.setTexture("normalSampler", this._scene.enableGeometryBufferRenderer()!.getGBuffer().textures[1]);
             } else {
-                effect.setTexture("depthNormalSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)]);
+                effect.setTexture("depthSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);
+                effect.setTexture("normalSampler", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)]);
             }
             effect.setTexture("randomSampler", this._randomTexture);
         };

+ 3 - 3
src/PostProcesses/motionBlurPostProcess.ts

@@ -213,7 +213,7 @@ export class MotionBlurPostProcess extends PostProcess {
             this._previousViewProjection = Matrix.Identity();
 
             if (this._prePassRenderer && this._prePassEffectConfiguration) {
-                this._prePassEffectConfiguration.texturesRequired[0] = Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE;
+                this._prePassEffectConfiguration.texturesRequired[0] = Constants.PREPASS_DEPTH_TEXTURE_TYPE;
             }
 
             this.onApply = (effect: Effect) => this._onApplyScreenBased(effect);
@@ -256,10 +256,10 @@ export class MotionBlurPostProcess extends PostProcess {
         effect.setFloat("motionStrength", this.motionStrength);
 
         if (this._geometryBufferRenderer) {
-            const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTHNORMAL_TEXTURE_TYPE);
+            const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE);
             effect.setTexture("depthSampler", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]);
         } else if (this._prePassRenderer) {
-            const depthIndex = this._prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE);
+            const depthIndex = this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE);
             effect.setTexture("depthSampler", this._prePassRenderer.getRenderTarget().textures[depthIndex]);
         }
     }

+ 1 - 4
src/PostProcesses/screenSpaceReflectionPostProcess.ts

@@ -123,7 +123,7 @@ export class ScreenSpaceReflectionPostProcess extends PostProcess {
                 // Samplers
                 const positionIndex = prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE);
                 const roughnessIndex = prePassRenderer.getIndex(Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE);
-                const normalIndex = prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE);
+                const normalIndex = prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE);
 
                 effect.setTexture("normalSampler", prePassRenderer.getRenderTarget().textures[normalIndex]);
                 effect.setTexture("positionSampler", prePassRenderer.getRenderTarget().textures[positionIndex]);
@@ -221,9 +221,6 @@ export class ScreenSpaceReflectionPostProcess extends PostProcess {
         const defines: string[] = [];
         if (this._geometryBufferRenderer || this._prePassRenderer) {
             defines.push("#define SSR_SUPPORTED");
-            if (this._prePassRenderer) {
-                defines.push("#define PREPASS_LAYOUT");
-            }
         }
         if (this._enableSmoothReflections) {
             defines.push("#define ENABLE_SMOOTH_REFLECTIONS");

+ 1 - 1
src/PostProcesses/subSurfaceScatteringPostProcess.ts

@@ -39,7 +39,7 @@ export class SubSurfaceScatteringPostProcess extends PostProcess {
             effect.setFloat("metersPerUnit", scene.subSurfaceConfiguration.metersPerUnit);
             effect.setFloat2("texelSize", texelSize.x, texelSize.y);
             effect.setTexture("irradianceSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE)]);
-            effect.setTexture("depthSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)]);
+            effect.setTexture("depthSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);
             effect.setTexture("albedoSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_ALBEDO_TEXTURE_TYPE)]);
             effect.setFloat2("viewportSize",
                 Math.tan(scene.activeCamera!.fov / 2) * scene.getEngine().getAspectRatio(scene.activeCamera!, true),

+ 25 - 13
src/Rendering/geometryBufferRenderer.ts

@@ -35,25 +35,30 @@ interface ISavedTransformationMatrix {
  */
 export class GeometryBufferRenderer {
     /**
-     * Constant used to retrieve the depth + normal texture index in the G-Buffer textures array
-     * using getIndex(GeometryBufferRenderer.DEPTHNORMAL_TEXTURE_INDEX)
+     * Constant used to retrieve the depth texture index in the G-Buffer textures array
+     * using getIndex(GeometryBufferRenderer.DEPTH_TEXTURE_INDEX)
      */
-    public static readonly DEPTHNORMAL_TEXTURE_TYPE = 0;
+    public static readonly DEPTH_TEXTURE_TYPE = 0;
+    /**
+     * Constant used to retrieve the normal texture index in the G-Buffer textures array
+     * using getIndex(GeometryBufferRenderer.NORMAL_TEXTURE_INDEX)
+     */
+    public static readonly NORMAL_TEXTURE_TYPE = 1;
     /**
      * Constant used to retrieve the position texture index in the G-Buffer textures array
      * using getIndex(GeometryBufferRenderer.POSITION_TEXTURE_INDEX)
      */
-    public static readonly POSITION_TEXTURE_TYPE = 1;
+    public static readonly POSITION_TEXTURE_TYPE = 2;
     /**
      * Constant used to retrieve the velocity texture index in the G-Buffer textures array
      * using getIndex(GeometryBufferRenderer.VELOCITY_TEXTURE_INDEX)
      */
-    public static readonly VELOCITY_TEXTURE_TYPE = 2;
+    public static readonly VELOCITY_TEXTURE_TYPE = 3;
     /**
      * Constant used to retrieve the reflectivity texture index in the G-Buffer textures array
      * using the getIndex(GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE)
      */
-    public static readonly REFLECTIVITY_TEXTURE_TYPE = 3;
+    public static readonly REFLECTIVITY_TEXTURE_TYPE = 4;
 
     /**
      * Dictionary used to store the previous transformation matrices of each rendered mesh
@@ -87,7 +92,8 @@ export class GeometryBufferRenderer {
     private _positionIndex: number = -1;
     private _velocityIndex: number = -1;
     private _reflectivityIndex: number = -1;
-    private _depthNormalIndex: number = -1;
+    private _depthIndex: number = -1;
+    private _normalIndex: number = -1;
 
     private _linkedWithPrePass: boolean = false;
     private _prePassRenderer: PrePassRenderer;
@@ -150,8 +156,10 @@ export class GeometryBufferRenderer {
         } else if (geometryBufferType === GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE) {
             this._reflectivityIndex = index;
             this._enableReflectivity = true;
-        } else if (geometryBufferType === GeometryBufferRenderer.DEPTHNORMAL_TEXTURE_TYPE) {
-            this._depthNormalIndex = index;
+        } else if (geometryBufferType === GeometryBufferRenderer.DEPTH_TEXTURE_TYPE) {
+            this._depthIndex = index;
+        } else if (geometryBufferType === GeometryBufferRenderer.NORMAL_TEXTURE_TYPE) {
+            this._normalIndex = index;
         }
     }
 
@@ -326,7 +334,7 @@ export class GeometryBufferRenderer {
         // Alpha test
         if (material) {
             let needUv = false;
-            if (material.needAlphaTesting()) {
+            if (material.needAlphaTesting() && material.getAlphaTestTexture()) {
                 defines.push("#define ALPHATEST");
                 needUv = true;
             }
@@ -363,9 +371,13 @@ export class GeometryBufferRenderer {
         // PrePass
         if (this._linkedWithPrePass) {
             defines.push("#define PREPASS");
-            if (this._depthNormalIndex !== -1) {
-                defines.push("#define DEPTHNORMAL_INDEX " + this._depthNormalIndex);
-                defines.push("#define PREPASS_DEPTHNORMAL");
+            if (this._depthIndex !== -1) {
+                defines.push("#define DEPTH_INDEX " + this._depthIndex);
+                defines.push("#define PREPASS_DEPTH");
+            }
+            if (this._normalIndex !== -1) {
+                defines.push("#define NORMAL_INDEX " + this._normalIndex);
+                defines.push("#define PREPASS_NORMAL");
             }
         }
 

+ 21 - 19
src/Rendering/prePassRenderer.ts

@@ -48,7 +48,7 @@ export class PrePassRenderer {
     public mrtCount: number = 0;
 
     private _mrtFormats: number[] = [];
-    private _mrtLayout: number[];
+    private _mrtLayout: number[] = [];
     private _textureIndices: number[] = [];
 
     private _multiRenderAttachments: number[];
@@ -86,7 +86,11 @@ export class PrePassRenderer {
             format: Constants.TEXTURETYPE_HALF_FLOAT,
         },
         {
-            type: Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE,
+            type: Constants.PREPASS_DEPTH_TEXTURE_TYPE,
+            format: Constants.TEXTURETYPE_HALF_FLOAT,
+        },
+        {
+            type: Constants.PREPASS_NORMAL_TEXTURE_TYPE,
             format: Constants.TEXTURETYPE_HALF_FLOAT,
         },
         {
@@ -133,30 +137,23 @@ export class PrePassRenderer {
     }
 
     private _geometryBuffer: Nullable<GeometryBufferRenderer>;
-    private _useGeometryBufferFallback = true;
 
     /**
-     * Uses the geometry buffer renderer as a fallback for non prepass capable effects
+     * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback
      */
-    public get useGeometryBufferFallback() : boolean {
-        return this._useGeometryBufferFallback;
-    }
+    public doNotUseGeometryRendererFallback = false;
 
-    public set useGeometryBufferFallback(value: boolean) {
-        this._useGeometryBufferFallback = value;
-
-        if (value) {
+    private _refreshGeometryBufferRendererLink() {
+        if (!this.doNotUseGeometryRendererFallback) {
             this._geometryBuffer = this._scene.enableGeometryBufferRenderer();
 
             if (!this._geometryBuffer) {
                 // Not supported
-                this._useGeometryBufferFallback = false;
+                this.doNotUseGeometryRendererFallback = true;
                 return;
             }
 
-            this._geometryBuffer.renderList = [];
             this._geometryBuffer._linkPrePassRenderer(this);
-            this._updateGeometryBufferLayout();
         } else {
             if (this._geometryBuffer) {
                 this._geometryBuffer._unlinkPrePassRenderer();
@@ -276,6 +273,8 @@ export class PrePassRenderer {
     }
 
     private _updateGeometryBufferLayout() {
+        this._refreshGeometryBufferRendererLink();
+
         if (this._geometryBuffer) {
             this._geometryBuffer._resetLayout();
 
@@ -289,8 +288,12 @@ export class PrePassRenderer {
 
             const matches = [
                 {
-                    prePassConstant: Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE,
-                    geometryBufferConstant: GeometryBufferRenderer.DEPTHNORMAL_TEXTURE_TYPE,
+                    prePassConstant: Constants.PREPASS_DEPTH_TEXTURE_TYPE,
+                    geometryBufferConstant: GeometryBufferRenderer.DEPTH_TEXTURE_TYPE,
+                },
+                {
+                    prePassConstant: Constants.PREPASS_NORMAL_TEXTURE_TYPE,
+                    geometryBufferConstant: GeometryBufferRenderer.NORMAL_TEXTURE_TYPE,
                 },
                 {
                     prePassConstant: Constants.PREPASS_POSITION_TEXTURE_TYPE,
@@ -354,7 +357,7 @@ export class PrePassRenderer {
         }
 
         if (this._geometryBuffer) {
-            this._geometryBuffer.renderList!.length = 0;
+            this._geometryBuffer.renderList = [];
         }
 
         this._setupOutputForThisPass(this._currentTarget, camera);
@@ -465,8 +468,6 @@ export class PrePassRenderer {
             }
         }
 
-        this._updateGeometryBufferLayout();
-
         for (let i = 0; i < this.renderTargets.length; i++) {
             if (this.mrtCount !== previousMrtCount) {
                 this.renderTargets[i].updateCount(this.mrtCount, { types: this._mrtFormats });
@@ -496,6 +497,7 @@ export class PrePassRenderer {
 
         this._reinitializeAttachments();
         this._setState(true);
+        this._updateGeometryBufferLayout();
     }
 
     private _disable() {

+ 1 - 1
src/Rendering/screenSpaceReflectionsConfiguration.ts

@@ -21,7 +21,7 @@ export class ScreenSpaceReflectionsConfiguration implements PrePassEffectConfigu
      * Textures that should be present in the MRT for this effect to work
      */
     public readonly texturesRequired: number[] = [
-        Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE,
+        Constants.PREPASS_NORMAL_TEXTURE_TYPE,
         Constants.PREPASS_REFLECTIVITY_TEXTURE_TYPE,
         Constants.PREPASS_POSITION_TEXTURE_TYPE,
     ];

+ 2 - 1
src/Rendering/ssao2Configuration.ts

@@ -21,6 +21,7 @@ export class SSAO2Configuration implements PrePassEffectConfiguration {
      * Textures that should be present in the MRT for this effect to work
      */
     public readonly texturesRequired: number[] = [
-        Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE
+        Constants.PREPASS_NORMAL_TEXTURE_TYPE,
+        Constants.PREPASS_DEPTH_TEXTURE_TYPE,
     ];
 }

+ 1 - 1
src/Rendering/subSurfaceConfiguration.ts

@@ -75,7 +75,7 @@ export class SubSurfaceConfiguration implements PrePassEffectConfiguration {
      * Textures that should be present in the MRT for this effect to work
      */
     public readonly texturesRequired: number[] = [
-        Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE,
+        Constants.PREPASS_DEPTH_TEXTURE_TYPE,
         Constants.PREPASS_ALBEDO_TEXTURE_TYPE,
         Constants.PREPASS_COLOR_TEXTURE_TYPE,
         Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE,

+ 1 - 1
src/Shaders/ShadersInclude/prePassDeclaration.fx

@@ -5,7 +5,7 @@ layout(location = 0) out highp vec4 glFragData[{X}];
 highp vec4 gl_FragColor;
 #endif
 
-#ifdef PREPASS_DEPTHNORMAL
+#ifdef PREPASS_DEPTH
     varying highp vec3 vViewPos;
 #endif
 #ifdef PREPASS_VELOCITY

+ 1 - 1
src/Shaders/ShadersInclude/prePassVertex.fx

@@ -1,4 +1,4 @@
-#ifdef PREPASS_DEPTHNORMAL
+#ifdef PREPASS_DEPTH
     vViewPos = (view * worldPos).rgb;
 #endif
 

+ 1 - 1
src/Shaders/ShadersInclude/prePassVertexDeclaration.fx

@@ -1,5 +1,5 @@
 #ifdef PREPASS
-#ifdef PREPASS_DEPTHNORMAL
+#ifdef PREPASS_DEPTH
     varying vec3 vViewPos;
 #endif
 #ifdef PREPASS_VELOCITY

+ 6 - 2
src/Shaders/default.fragment.fx

@@ -497,8 +497,12 @@ color.rgb = max(color.rgb, 0.);
         gl_FragData[PREPASS_IRRADIANCE_INDEX] = vec4(0.0, 0.0, 0.0, 1.0); //  We can't split irradiance on std material
     #endif
 
-    #ifdef PREPASS_DEPTHNORMAL
-    	gl_FragData[PREPASS_DEPTHNORMAL_INDEX] = vec4(vViewPos.z, (view * vec4(normalW, 0.0)).rgb); // Linear depth + normal
+    #ifdef PREPASS_DEPTH
+        gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, 1.0); // Linear depth
+    #endif
+
+    #ifdef PREPASS_NORMAL
+        gl_FragData[PREPASS_NORMAL_INDEX] = vec4((view * vec4(normalW, 0.0)).rgb, 1.0); // Normal
     #endif
 
     #ifdef PREPASS_ALBEDO

+ 6 - 2
src/Shaders/geometry.fragment.fx

@@ -63,8 +63,12 @@ void main() {
     #endif
 
     #ifdef PREPASS
-        #ifdef PREPASS_DEPTHNORMAL
-        gl_FragData[DEPTHNORMAL_INDEX] = vec4(vViewPos.z / vViewPos.w, normalOutput);
+        #ifdef PREPASS_DEPTH
+        gl_FragData[DEPTH_INDEX] = vec4(vViewPos.z / vViewPos.w, 0.0, 0.0, 1.0);
+        #endif
+
+        #ifdef PREPASS_NORMAL
+        gl_FragData[NORMAL_INDEX] = vec4(normalOutput, 1.0);
         #endif
     #else
     gl_FragData[0] = vec4(vViewPos.z / vViewPos.w, 0.0, 0.0, 1.0);

+ 6 - 2
src/Shaders/pbr.fragment.fx

@@ -568,8 +568,12 @@ void main(void) {
         gl_FragData[0] = vec4(finalColor.rgb, finalColor.a);
     #endif
 
-    #ifdef PREPASS_DEPTHNORMAL
-        gl_FragData[PREPASS_DEPTHNORMAL_INDEX] = vec4(vViewPos.z, (view * vec4(normalW, 0.0)).rgb); // Linear depth + normal
+    #ifdef PREPASS_DEPTH
+        gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, 1.0); // Linear depth
+    #endif
+
+    #ifdef PREPASS_NORMAL
+        gl_FragData[PREPASS_NORMAL_INDEX] = vec4((view * vec4(normalW, 0.0)).rgb, 1.0); // Normal
     #endif
 
     #ifdef PREPASS_ALBEDO

+ 0 - 4
src/Shaders/screenSpaceReflection.fragment.fx

@@ -135,11 +135,7 @@ void main()
         }
         
         // Get coordinates of the pixel to pick according to the pixel's position and normal.
-        #ifdef PREPASS_LAYOUT
-        vec3 normal = (texture2D(normalSampler, vUV)).gba;
-        #else
         vec3 normal = (texture2D(normalSampler, vUV)).xyz;
-        #endif
         vec3 position = (view * texture2D(positionSampler, vUV)).xyz;
         vec3 reflected = normalize(reflect(normalize(position), normalize(normal)));
 

+ 15 - 31
src/Shaders/ssao2.fragment.fx

@@ -41,12 +41,8 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 #ifdef SSAO
 	uniform sampler2D randomSampler;
 
-	#ifndef GEOMETRYBUFFER
-		uniform sampler2D depthNormalSampler;
-	#else
-		uniform sampler2D depthSampler;
-		uniform sampler2D normalSampler;
-	#endif
+	uniform sampler2D depthSampler;
+	uniform sampler2D normalSampler;
 
 	uniform float randTextureTiles;
 	uniform float samplesFactor;
@@ -65,18 +61,10 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 	void main()
 	{
 		vec3 random = texture2D(randomSampler, vUV * randTextureTiles).rgb;
-		#ifndef GEOMETRYBUFFER
-			float depth = texture2D(depthNormalSampler, vUV).r;
-		#else 
-			float depth = texture2D(depthSampler, vUV).r;
-		#endif
+		float depth = texture2D(depthSampler, vUV).r;
 		float depthSign = depth / abs(depth);
 		depth = depth * depthSign;
-		#ifndef GEOMETRYBUFFER
-			vec3 normal = texture2D(depthNormalSampler, vUV).gba; 
-		#else 
-			vec3 normal = texture2D(normalSampler, vUV).rgb;
-		#endif
+		vec3 normal = texture2D(normalSampler, vUV).rgb;
 		float occlusion = 0.0;
 		float correctedRadius = min(radius, minZAspect * depth / near);
 
@@ -110,11 +98,7 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 		    }
 		  
 			// get sample linearDepth:
-			#ifndef GEOMETRYBUFFER
-		    	float sampleDepth = abs(texture2D(depthNormalSampler, offset.xy).r);
-		    #else
-		    	float sampleDepth = abs(texture2D(depthSampler, offset.xy).r);
-		    #endif
+		    float sampleDepth = abs(texture2D(depthSampler, offset.xy).r);
 			// range check & accumulate:
 		    difference = depthSign * samplePosition.z - sampleDepth;
 		    float rangeCheck = 1.0 - smoothstep(correctedRadius*0.5, correctedRadius, difference);
@@ -128,7 +112,7 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 #endif
 
 #ifdef BILATERAL_BLUR
-	uniform sampler2D depthNormalSampler;
+	uniform sampler2D depthSampler;
 	uniform float outSize;
 	uniform float samplerOffsets[SAMPLES];
 
@@ -165,39 +149,39 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 	  vec2 off2 = vec2(3.2941176470588234) * direction;
 	  vec2 off3 = vec2(5.176470588235294) * direction;
 
-	  float compareDepth = abs(texture2D(depthNormalSampler, uv).r);
+	  float compareDepth = abs(texture2D(depthSampler, uv).r);
 	  float sampleDepth;
 	  float weight;
 	  float weightSum = 30.0;
 
 	  color += texture2D(image, uv) * 30.0;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv + (off1 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv + (off1 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum +=  weight;
 	  color += texture2D(image, uv + (off1 / resolution)) * weight;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv - (off1 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv - (off1 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum +=  weight;
 	  color += texture2D(image, uv - (off1 / resolution)) * weight;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv + (off2 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv + (off2 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum += weight;
 	  color += texture2D(image, uv + (off2 / resolution)) * weight;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv - (off2 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv - (off2 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum += weight;
 	  color += texture2D(image, uv - (off2 / resolution)) * weight;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv + (off3 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv + (off3 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum += weight;
 	  color += texture2D(image, uv + (off3 / resolution)) * weight;
 
-	  sampleDepth = abs(texture2D(depthNormalSampler, uv - (off3 / resolution)).r);
+	  sampleDepth = abs(texture2D(depthSampler, uv - (off3 / resolution)).r);
 	  weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30.0);
 	  weightSum += weight;
 	  color += texture2D(image, uv - (off3 / resolution)) * weight;
@@ -208,7 +192,7 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 	void main()
 	{
 		#if EXPENSIVE
-		float compareDepth = abs(texture2D(depthNormalSampler, vUV).r);
+		float compareDepth = abs(texture2D(depthSampler, vUV).r);
 		float texelsize = 1.0 / outSize;
 		float result = 0.0;
 		float weightSum = 0.0;
@@ -224,7 +208,7 @@ float viewZToOrthographicDepth( const in float viewZ, const in float near, const
 			#endif
 			vec2 samplePos = vUV + sampleOffset;
 
-			float sampleDepth = abs(texture2D(depthNormalSampler, samplePos).r);
+			float sampleDepth = abs(texture2D(depthSampler, samplePos).r);
 			float weight = clamp(1.0 / ( 0.003 + abs(compareDepth - sampleDepth)), 0.0, 30000.0);
 
 			result += texture2D(textureSampler, samplePos).r * weight;