Преглед изворни кода

warning WebGL 1 + avoiding early effect creation if subsurface is set to false on a material

Benjamin Guignabert пре 5 година
родитељ
комит
61de278985

+ 1 - 1
inspector/src/components/actionTabs/tabs/propertyGrids/materials/pbrMaterialPropertyGridComponent.tsx

@@ -246,7 +246,7 @@ export class PBRMaterialPropertyGridComponent extends React.Component<IPBRMateri
                     <CheckBoxLineComponent label="Scattering Enabled" target={material.subSurface} propertyName="isScatteringEnabled"
                         onValueChanged={() => this.forceUpdate()}
                         onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
-                    { (material.subSurface as any).isScatteringEnabled &&
+                    { (material.subSurface as any).isScatteringEnabled && material.getScene().prePassRenderer &&
                         <SliderLineComponent label="Meters per unit" target={ material.getScene().prePassRenderer } propertyName="metersPerUnit" minimum={0.01} maximum={2} step={0.01} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
                     }
                     <CheckBoxLineComponent label="Refraction Enabled" target={material.subSurface} propertyName="isRefractionEnabled"

+ 22 - 13
src/Rendering/prePassRenderer.ts

@@ -102,6 +102,10 @@ export class PrePassRenderer {
     }
 
     public set samples(n: number) {
+        if (!this.subSurfaceScatteringPostProcess) {
+            this._createEffects();
+        }
+        
         this.prePassRT.samples = n;
     }
 
@@ -112,19 +116,11 @@ export class PrePassRenderer {
     constructor(scene: Scene) {
         this._scene = scene;
         this._engine = scene.getEngine();
-        PrePassRenderer._SceneComponentInitialization(this._scene);
-
-        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 });
-        this.prePassRT.samples = 1;
 
-        this._initializeAttachments();
+        PrePassRenderer._SceneComponentInitialization(this._scene);
 
         // Adding default diffusion profile
         this.addDiffusionProfile(new Color3(1, 1, 1));
-        this.imageProcessingPostProcess = new ImageProcessingPostProcess("sceneCompositionPass", 1, null, undefined, this._engine);
-        this.subSurfaceScatteringPostProcess = new SubSurfaceScatteringPostProcess("subSurfaceScattering", this._scene, 1, null, undefined, this._engine);
-        this.subSurfaceScatteringPostProcess.inputTexture = this.prePassRT.getInternalTexture()!;
     }
 
     private _initializeAttachments() {
@@ -144,12 +140,23 @@ export class PrePassRenderer {
         }
     }
 
+    private _createEffects() {
+        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 });
+        this.prePassRT.samples = 1;
+
+        this._initializeAttachments();
+
+        this.imageProcessingPostProcess = new ImageProcessingPostProcess("sceneCompositionPass", 1, null, undefined, this._engine);
+        this.subSurfaceScatteringPostProcess = new SubSurfaceScatteringPostProcess("subSurfaceScattering", this._scene, 1, null, undefined, this._engine);
+        this.subSurfaceScatteringPostProcess.inputTexture = this.prePassRT.getInternalTexture()!;
+    }
+
     /**
      * Indicates if rendering a prepass is supported
      */
     public get isSupported() {
-        // TODO
-        return true;
+        return this._engine.webGLVersion > 1;
     }
 
     /**
@@ -233,6 +240,9 @@ export class PrePassRenderer {
     }
 
     private _enable() {
+        if (!this.subSurfaceScatteringPostProcess) {
+            this._createEffects();
+        }
         this._enabled = true;
         this._scene.prePass = true;
         this.imageProcessingPostProcess.imageProcessingConfiguration.applyByPostProcess = true;
@@ -263,8 +273,7 @@ export class PrePassRenderer {
             }
         }
 
-        // SSAO 2
-        // TODO
+        // add SSAO 2 etc..
 
         this._isDirty = false;
 

+ 5 - 0
src/Rendering/prePassRendererSceneComponent.ts

@@ -4,6 +4,7 @@ import { ISceneSerializableComponent, SceneComponentConstants } from "../sceneCo
 import { PrePassRenderer } from "./prePassRenderer";
 import { AbstractScene } from "../abstractScene";
 import { Color3 } from "../Maths/math.color";
+import { Logger } from "../Misc/logger";
 
 declare module "../abstractScene" {
     export interface AbstractScene {
@@ -55,8 +56,12 @@ Scene.prototype.enablePrePassRenderer = function(): Nullable<PrePassRenderer> {
     }
 
     this._prePassRenderer = new PrePassRenderer(this);
+
     if (!this._prePassRenderer.isSupported) {
         this._prePassRenderer = null;
+        Logger.Error("Pre-pass needs WebGL 2.")
+        Logger.Error("Maybe you tried to use the following features that need pre-pass :")
+        Logger.Error(" + Subsurface Scattering")
     }
 
     return this._prePassRenderer;