瀏覽代碼

Merge branch 'prepass-enable-per-texture' of github.com:CraigFeldspar/Babylon.js into prepass-enable-per-texture

Benjamin Guignabert 4 年之前
父節點
當前提交
b7855baaed
共有 26 個文件被更改,包括 153 次插入25 次删除
  1. 2 3
      src/Materials/Textures/prePassRenderTarget.ts
  2. 11 10
      src/Rendering/prePassRenderer.ts
  3. 10 8
      src/Shaders/default.fragment.fx
  4. 4 4
      src/Shaders/pbr.fragment.fx
  5. 二進制
      tests/validation/ReferenceImages/prepass-mirror-with-pp.png
  6. 二進制
      tests/validation/ReferenceImages/prepass-mirror-without-pp.png
  7. 二進制
      tests/validation/ReferenceImages/prepass-ssao-b-and-w.png
  8. 二進制
      tests/validation/ReferenceImages/prepass-ssao-bbr.png
  9. 二進制
      tests/validation/ReferenceImages/prepass-ssao-clip-planes.png
  10. 二進制
      tests/validation/ReferenceImages/prepass-ssao-depth-renderer.png
  11. 二進制
      tests/validation/ReferenceImages/prepass-ssao-dof.png
  12. 二進制
      tests/validation/ReferenceImages/prepass-ssao-glow-layer.png
  13. 二進制
      tests/validation/ReferenceImages/prepass-ssao-gui.png
  14. 二進制
      tests/validation/ReferenceImages/prepass-ssao-highlight-layer.png
  15. 二進制
      tests/validation/ReferenceImages/prepass-ssao-instanced-bones.png
  16. 二進制
      tests/validation/ReferenceImages/prepass-ssao-instances.png
  17. 二進制
      tests/validation/ReferenceImages/prepass-ssao-line-edges.png
  18. 二進制
      tests/validation/ReferenceImages/prepass-ssao-lod.png
  19. 二進制
      tests/validation/ReferenceImages/prepass-ssao-on-off-pp.png
  20. 二進制
      tests/validation/ReferenceImages/prepass-ssao-particles.png
  21. 二進制
      tests/validation/ReferenceImages/prepass-ssao-point-light.png
  22. 二進制
      tests/validation/ReferenceImages/prepass-ssao-shadow-only.png
  23. 二進制
      tests/validation/ReferenceImages/prepass-ssao-sprites.png
  24. 二進制
      tests/validation/ReferenceImages/prepass-ssao-thin-instances.png
  25. 二進制
      tests/validation/ReferenceImages/prepass-ssao-visibility.png
  26. 126 0
      tests/validation/config.json

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

@@ -66,7 +66,7 @@ export class PrePassRenderTarget extends MultiRenderTarget {
     public _checkSize() {
     public _checkSize() {
         var	requiredWidth = this._engine.getRenderWidth(true);
         var	requiredWidth = this._engine.getRenderWidth(true);
         var	requiredHeight = this._engine.getRenderHeight(true);
         var	requiredHeight = this._engine.getRenderHeight(true);
-        
+
         var width = this.getRenderWidth();
         var width = this.getRenderWidth();
         var height = this.getRenderHeight();
         var height = this.getRenderHeight();
 
 
@@ -77,7 +77,6 @@ export class PrePassRenderTarget extends MultiRenderTarget {
         }
         }
     }
     }
 
 
-
     /**
     /**
      * Changes the number of render targets in this MRT
      * Changes the number of render targets in this MRT
      * Be careful as it will recreate all the data in the new texture.
      * Be careful as it will recreate all the data in the new texture.
@@ -102,7 +101,7 @@ export class PrePassRenderTarget extends MultiRenderTarget {
     public dispose() {
     public dispose() {
         super.dispose();
         super.dispose();
 
 
-        if (this._scene.prePassRenderer) {
+        if (this._scene && this._scene.prePassRenderer) {
             const index = this._scene.prePassRenderer.renderTargets.indexOf(this);
             const index = this._scene.prePassRenderer.renderTargets.indexOf(this);
 
 
             if (index !== -1) {
             if (index !== -1) {

+ 11 - 10
src/Rendering/prePassRenderer.ts

@@ -141,7 +141,7 @@ export class PrePassRenderer {
     /**
     /**
      * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback
      * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback
      */
      */
-    public doNotUseGeometryRendererFallback = false;
+    public doNotUseGeometryRendererFallback = true;
 
 
     private _refreshGeometryBufferRendererLink() {
     private _refreshGeometryBufferRendererLink() {
         if (!this.doNotUseGeometryRendererFallback) {
         if (!this.doNotUseGeometryRendererFallback) {
@@ -563,19 +563,20 @@ export class PrePassRenderer {
     }
     }
 
 
     private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {
     private _linkInternalTexture(prePassRenderTarget: PrePassRenderTarget, postProcess: Nullable<PostProcess>) {
-        if (prePassRenderTarget._internalTextureDirty || prePassRenderTarget._outputPostProcess !== postProcess) {
-            this._updateGeometryBufferLayout();
-            if (postProcess) {
-                postProcess.autoClear = false;
-                postProcess.inputTexture = prePassRenderTarget.getInternalTexture()!;
-            }
+        if (postProcess) {
+            postProcess.autoClear = false;
+            postProcess.inputTexture = prePassRenderTarget.getInternalTexture()!;
+        }
 
 
-            // Restore previous texture that was forced to the prepass texture
-            if (prePassRenderTarget._outputPostProcess && prePassRenderTarget._outputPostProcess !== postProcess) {
+        if (prePassRenderTarget._outputPostProcess !== postProcess) {
+            if (prePassRenderTarget._outputPostProcess) {
                 prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();
                 prePassRenderTarget._outputPostProcess.restoreDefaultInputTexture();
             }
             }
-
             prePassRenderTarget._outputPostProcess = postProcess;
             prePassRenderTarget._outputPostProcess = postProcess;
+        }
+
+        if (prePassRenderTarget._internalTextureDirty) {
+            this._updateGeometryBufferLayout();
             prePassRenderTarget._internalTextureDirty = false;
             prePassRenderTarget._internalTextureDirty = false;
         }
         }
     }
     }

+ 10 - 8
src/Shaders/default.fragment.fx

@@ -477,10 +477,12 @@ color.rgb = max(color.rgb, 0.);
 
 
 #define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR
 #define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR
 #ifdef PREPASS
 #ifdef PREPASS
+	float writeGeometryInfo = color.a > 0.4 ? 1.0 : 0.0;
+
     gl_FragData[0] = color; // We can't split irradiance on std material
     gl_FragData[0] = color; // We can't split irradiance on std material
     
     
     #ifdef PREPASS_POSITION
     #ifdef PREPASS_POSITION
-    gl_FragData[PREPASS_POSITION_INDEX] = vec4(vPositionW, 1.0);
+    gl_FragData[PREPASS_POSITION_INDEX] = vec4(vPositionW, writeGeometryInfo);
     #endif
     #endif
 
 
     #ifdef PREPASS_VELOCITY
     #ifdef PREPASS_VELOCITY
@@ -490,29 +492,29 @@ color.rgb = max(color.rgb, 0.);
     vec2 velocity = abs(a - b);
     vec2 velocity = abs(a - b);
     velocity = vec2(pow(velocity.x, 1.0 / 3.0), pow(velocity.y, 1.0 / 3.0)) * sign(a - b) * 0.5 + 0.5;
     velocity = vec2(pow(velocity.x, 1.0 / 3.0), pow(velocity.y, 1.0 / 3.0)) * sign(a - b) * 0.5 + 0.5;
 
 
-    gl_FragData[PREPASS_VELOCITY_INDEX] = vec4(velocity, 0.0, 1.0);
+    gl_FragData[PREPASS_VELOCITY_INDEX] = vec4(velocity, 0.0, writeGeometryInfo);
     #endif
     #endif
 
 
     #ifdef PREPASS_IRRADIANCE
     #ifdef PREPASS_IRRADIANCE
-        gl_FragData[PREPASS_IRRADIANCE_INDEX] = vec4(0.0, 0.0, 0.0, 1.0); //  We can't split irradiance on std material
+        gl_FragData[PREPASS_IRRADIANCE_INDEX] = vec4(0.0, 0.0, 0.0, writeGeometryInfo); //  We can't split irradiance on std material
     #endif
     #endif
 
 
     #ifdef PREPASS_DEPTH
     #ifdef PREPASS_DEPTH
-        gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, 1.0); // Linear depth
+        gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, writeGeometryInfo); // Linear depth
     #endif
     #endif
 
 
     #ifdef PREPASS_NORMAL
     #ifdef PREPASS_NORMAL
-        gl_FragData[PREPASS_NORMAL_INDEX] = vec4((view * vec4(normalW, 0.0)).rgb, 1.0); // Normal
+        gl_FragData[PREPASS_NORMAL_INDEX] = vec4((view * vec4(normalW, 0.0)).rgb, writeGeometryInfo); // Normal
     #endif
     #endif
 
 
     #ifdef PREPASS_ALBEDO
     #ifdef PREPASS_ALBEDO
-        gl_FragData[PREPASS_ALBEDO_INDEX] = vec4(0.0, 0.0, 0.0, 1.0); // We can't split albedo on std material
+        gl_FragData[PREPASS_ALBEDO_INDEX] = vec4(0.0, 0.0, 0.0, writeGeometryInfo); // We can't split albedo on std material
     #endif
     #endif
     #ifdef PREPASS_REFLECTIVITY
     #ifdef PREPASS_REFLECTIVITY
         #if defined(SPECULAR)
         #if defined(SPECULAR)
-            gl_FragData[PREPASS_REFLECTIVITY_INDEX] = specularMapColor;
+            gl_FragData[PREPASS_REFLECTIVITY_INDEX] = vec3(specularMapColor.rgb, writeGeometryInfo);
         #else
         #else
-            gl_FragData[PREPASS_REFLECTIVITY_INDEX] = vec4(0.0, 0.0, 0.0, 1.0);
+            gl_FragData[PREPASS_REFLECTIVITY_INDEX] = vec4(0.0, 0.0, 0.0, writeGeometryInfo);
         #endif
         #endif
     #endif
     #endif
 #endif
 #endif

+ 4 - 4
src/Shaders/pbr.fragment.fx

@@ -532,8 +532,10 @@ void main(void) {
     #define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR
     #define CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR
 
 
 #ifdef PREPASS
 #ifdef PREPASS
+    float writeGeometryInfo = finalColor.a > 0.4 ? 1.0 : 0.0;
+    
     #ifdef PREPASS_POSITION
     #ifdef PREPASS_POSITION
-    gl_FragData[PREPASS_POSITION_INDEX] = vec4(vPositionW, 1.0);
+    gl_FragData[PREPASS_POSITION_INDEX] = vec4(vPositionW, writeGeometryInfo);
     #endif
     #endif
 
 
     #ifdef PREPASS_VELOCITY
     #ifdef PREPASS_VELOCITY
@@ -543,7 +545,7 @@ void main(void) {
     vec2 velocity = abs(a - b);
     vec2 velocity = abs(a - b);
     velocity = vec2(pow(velocity.x, 1.0 / 3.0), pow(velocity.y, 1.0 / 3.0)) * sign(a - b) * 0.5 + 0.5;
     velocity = vec2(pow(velocity.x, 1.0 / 3.0), pow(velocity.y, 1.0 / 3.0)) * sign(a - b) * 0.5 + 0.5;
 
 
-    gl_FragData[PREPASS_VELOCITY_INDEX] = vec4(velocity, 0.0, 1.0);
+    gl_FragData[PREPASS_VELOCITY_INDEX] = vec4(velocity, 0.0, writeGeometryInfo);
     #endif
     #endif
 
 
     #ifdef PREPASS_IRRADIANCE
     #ifdef PREPASS_IRRADIANCE
@@ -567,8 +569,6 @@ void main(void) {
     #else
     #else
         gl_FragData[0] = vec4(finalColor.rgb, finalColor.a);
         gl_FragData[0] = vec4(finalColor.rgb, finalColor.a);
     #endif
     #endif
-
-    float writeGeometryInfo = finalColor.a > 0.4 ? 1.0 : 0.0;
     
     
     #ifdef PREPASS_DEPTH
     #ifdef PREPASS_DEPTH
         gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, writeGeometryInfo); // Linear depth
         gl_FragData[PREPASS_DEPTH_INDEX] = vec4(vViewPos.z, 0.0, 0.0, writeGeometryInfo); // Linear depth

二進制
tests/validation/ReferenceImages/prepass-mirror-with-pp.png


二進制
tests/validation/ReferenceImages/prepass-mirror-without-pp.png


二進制
tests/validation/ReferenceImages/prepass-ssao-b-and-w.png


二進制
tests/validation/ReferenceImages/prepass-ssao-bbr.png


二進制
tests/validation/ReferenceImages/prepass-ssao-clip-planes.png


二進制
tests/validation/ReferenceImages/prepass-ssao-depth-renderer.png


二進制
tests/validation/ReferenceImages/prepass-ssao-dof.png


二進制
tests/validation/ReferenceImages/prepass-ssao-glow-layer.png


二進制
tests/validation/ReferenceImages/prepass-ssao-gui.png


二進制
tests/validation/ReferenceImages/prepass-ssao-highlight-layer.png


二進制
tests/validation/ReferenceImages/prepass-ssao-instanced-bones.png


二進制
tests/validation/ReferenceImages/prepass-ssao-instances.png


二進制
tests/validation/ReferenceImages/prepass-ssao-line-edges.png


二進制
tests/validation/ReferenceImages/prepass-ssao-lod.png


二進制
tests/validation/ReferenceImages/prepass-ssao-on-off-pp.png


二進制
tests/validation/ReferenceImages/prepass-ssao-particles.png


二進制
tests/validation/ReferenceImages/prepass-ssao-point-light.png


二進制
tests/validation/ReferenceImages/prepass-ssao-shadow-only.png


二進制
tests/validation/ReferenceImages/prepass-ssao-sprites.png


二進制
tests/validation/ReferenceImages/prepass-ssao-thin-instances.png


二進制
tests/validation/ReferenceImages/prepass-ssao-visibility.png


+ 126 - 0
tests/validation/config.json

@@ -973,6 +973,132 @@
             "renderCount": 10,
             "renderCount": 10,
             "playgroundId": "#MSAHKR#13",
             "playgroundId": "#MSAHKR#13",
             "referenceImage": "shadowsinstancesright.png"
             "referenceImage": "shadowsinstancesright.png"
+        },
+        {
+            "title": "Prepass SSAO + instances",
+            "renderCount": 10,
+            "playgroundId": "#YB006J#349",
+            "referenceImage": "prepass-ssao-instances.png"
+        },
+        {
+            "title": "Prepass SSAO + instanced bones",
+            "renderCount": 10,
+            "playgroundId": "#0K8EYN#194",
+            "referenceImage": "prepass-ssao-instanced-bones.png"
+        },
+        {
+            "title": "Prepass SSAO + particles",
+            "renderCount": 30,
+            "playgroundId": "#65MUMZ#40",
+            "referenceImage": "prepass-ssao-particles.png"
+        },
+        {
+            "title": "Prepass SSAO + depth of field",
+            "renderCount": 10,
+            "playgroundId": "#DX6AV#88",
+            "referenceImage": "prepass-ssao-dof.png"
+        },
+        {
+            "title": "Prepass + mirror, without postprocess",
+            "renderCount": 10,
+            "playgroundId": "#PIZ1GK#212",
+            "referenceImage": "prepass-mirror-without-pp.png"
+        },
+        {
+            "title": "Prepass + mirror, with postprocesses",
+            "renderCount": 10,
+            "playgroundId": "#PIZ1GK#213",
+            "referenceImage": "prepass-mirror-with-pp.png"
+        },
+        {
+            "title": "Prepass SSAO + sprites",
+            "renderCount": 10,
+            "playgroundId": "#9RI8CG#187",
+            "referenceImage": "prepass-ssao-sprites.png"
+        },
+        {
+            "title": "Prepass SSAO + glow layer",
+            "renderCount": 10,
+            "playgroundId": "#LRFB2D#114",
+            "referenceImage": "prepass-ssao-glow-layer.png"
+        },
+        {
+            "title": "Prepass SSAO + bounding box renderer",
+            "renderCount": 10,
+            "playgroundId": "#4F33I3#35",
+            "referenceImage": "prepass-ssao-bbr.png"
+        },
+        {
+            "title": "Prepass SSAO + line edges renderer",
+            "renderCount": 10,
+            "playgroundId": "#T90MQ4#3",
+            "referenceImage": "prepass-ssao-line-edges.png"
+        },
+        {
+            "title": "Prepass SSAO + B&W post process",
+            "renderCount": 10,
+            "playgroundId": "#N55Q2M#8",
+            "referenceImage": "prepass-ssao-b-and-w.png"
+        },
+        {
+            "title": "Prepass SSAO + clip planes",
+            "renderCount": 10,
+            "playgroundId": "#Y6W087#71",
+            "referenceImage": "prepass-ssao-clip-planes.png"
+        },
+        {
+            "title": "Prepass SSAO + GUI",
+            "renderCount": 10,
+            "playgroundId": "#LLVZ90#4",
+            "referenceImage": "prepass-ssao-gui.png"
+        },
+        {
+            "title": "Prepass SSAO + LOD",
+            "renderCount": 10,
+            "playgroundId": "#FFMFW5#29",
+            "referenceImage": "prepass-ssao-lod.png"
+        },
+        {
+            "title": "Prepass SSAO + shadow only",
+            "renderCount": 10,
+            "playgroundId": "#1KF7V1#55",
+            "referenceImage": "prepass-ssao-shadow-only.png"
+        },
+        {
+            "title": "Prepass SSAO + highlight layer",
+            "renderCount": 10,
+            "playgroundId": "#1KUJ0A#416",
+            "referenceImage": "prepass-ssao-highlight-layer.png"
+        },
+        {
+            "title": "Prepass SSAO + point light",
+            "renderCount": 10,
+            "playgroundId": "#XDNVAY#5",
+            "referenceImage": "prepass-ssao-point-light.png"
+        },
+        {
+            "title": "Prepass SSAO + on/off post-process",
+            "renderCount": 10,
+            "playgroundId": "#1VI6WV#20",
+            "referenceImage": "prepass-ssao-on-off-pp.png"
+        },
+        {
+            "title": "Prepass SSAO + thin instances",
+            "renderCount": 10,
+            "playgroundId": "#V1JE4Z#25",
+            "referenceImage": "prepass-ssao-thin-instances.png"
+        },
+        {
+            "title": "Prepass SSAO + depth renderer",
+            "renderCount": 10,
+            "playgroundId": "#3HPMAA#1",
+            "referenceImage": "prepass-ssao-depth-renderer.png"
+        },
+        {
+            "title": "Prepass SSAO + visibility",
+            "renderCount": 10,
+            "playgroundId": "#PXC9CF#4",
+            "referenceImage": "prepass-ssao-visibility.png"
         }
         }
     ]
     ]
 }
 }