瀏覽代碼

Fix support of realtime filtering

Popov72 4 年之前
父節點
當前提交
a4c2934754

+ 3 - 0
src/Materials/Node/Blocks/PBR/reflectionBlock.ts

@@ -403,6 +403,9 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock {
                     ${this._2DSamplerName},
                 #endif
             #endif
+            #ifdef REALTIME_FILTERING
+                ${this._vReflectionFilteringInfoName},
+            #endif
                 reflectionOut
             );
         #endif\r\n`;

+ 11 - 0
src/Materials/Node/Blocks/PBR/refractionBlock.ts

@@ -18,6 +18,7 @@ import { NodeMaterialBlock } from '../../nodeMaterialBlock';
 import { CubeTexture } from '../../../Textures/cubeTexture';
 import { Texture } from '../../../Textures/texture';
 import { NodeMaterialSystemValues } from '../../Enums/nodeMaterialSystemValues';
+import { Scalar } from '../../../../Maths/math.scalar';
 
 /**
  * Block used to implement the refraction part of the sub surface module of the PBR material
@@ -42,6 +43,8 @@ export class RefractionBlock extends NodeMaterialBlock {
     public _vRefractionMicrosurfaceInfosName: string;
     /** @hidden */
     public _vRefractionInfosName: string;
+    /** @hidden */
+    public _vRefractionFilteringInfoName: string;
 
     private _scene: Scene;
 
@@ -221,6 +224,10 @@ export class RefractionBlock extends NodeMaterialBlock {
         effect.setFloat4(this._vRefractionInfosName, refractionTexture.level, 1 / indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);
 
         effect.setFloat3(this._vRefractionMicrosurfaceInfosName, refractionTexture.getSize().width, refractionTexture.lodGenerationScale, refractionTexture.lodGenerationOffset);
+
+        const width = refractionTexture.getSize().width;
+
+        effect.setFloat2(this._vRefractionFilteringInfoName, width, Scalar.Log2(width));
     }
 
     /**
@@ -283,6 +290,10 @@ export class RefractionBlock extends NodeMaterialBlock {
 
         state._emitUniformFromString(this._vRefractionInfosName, "vec4");
 
+        this._vRefractionFilteringInfoName = state._getFreeVariableName("vRefractionFilteringInfo");
+
+        state._emitUniformFromString(this._vRefractionFilteringInfoName, "vec2");
+
         return code;
     }
 

+ 8 - 1
src/Materials/Node/Blocks/PBR/subSurfaceBlock.ts

@@ -165,7 +165,11 @@ export class SubSurfaceBlock extends NodeMaterialBlock {
                         #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
                             reflectionOut.irradianceVector,
                         #endif
-                    #endif
+                        #if defined(REALTIME_FILTERING)
+                            ${reflectionBlock?._cubeSamplerName},
+                            ${reflectionBlock?._vReflectionFilteringInfoName},
+                        #endif
+                        #endif
                     #ifdef USEIRRADIANCEMAP
                         irradianceSampler,
                     #endif
@@ -208,6 +212,9 @@ export class SubSurfaceBlock extends NodeMaterialBlock {
                 #ifdef ANISOTROPIC
                     anisotropicOut,
                 #endif
+                #ifdef REALTIME_FILTERING
+                    ${refractionBlock?._vRefractionFilteringInfoName ?? ""},
+                #endif
             #endif
             #ifdef SS_TRANSLUCENCY
                 ${translucencyDiffusionDistance},

+ 6 - 0
src/Shaders/ShadersInclude/pbrBlockClearcoat.fx

@@ -86,6 +86,9 @@ struct clearcoatOutParams
                 const in sampler2D reflectionSamplerHigh,
             #endif
         #endif
+        #ifdef REALTIME_FILTERING
+            const in vec2 vReflectionFilteringInfo,
+        #endif
     #endif
     #if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
         #ifdef RADIANCEOCCLUSION
@@ -255,6 +258,9 @@ struct clearcoatOutParams
                 reflectionSamplerLow,
                 reflectionSamplerHigh,
             #endif
+            #ifdef REALTIME_FILTERING
+                vReflectionFilteringInfo,
+            #endif
                 environmentClearCoatRadiance
             );
 

+ 9 - 0
src/Shaders/ShadersInclude/pbrBlockReflection.fx

@@ -82,6 +82,9 @@
             const in sampler2D reflectionSamplerHigh,
         #endif
     #endif
+    #ifdef REALTIME_FILTERING
+        const in vec2 vReflectionFilteringInfo,
+    #endif
         out vec4 environmentRadiance
     )
     {
@@ -199,6 +202,9 @@
             const in sampler2D reflectionSamplerHigh,
         #endif
     #endif
+    #ifdef REALTIME_FILTERING
+        const in vec2 vReflectionFilteringInfo,
+    #endif
         out reflectionOutParams outParams
     )
     {
@@ -242,6 +248,9 @@
             reflectionSamplerLow,
             reflectionSamplerHigh,
         #endif
+        #ifdef REALTIME_FILTERING
+            vReflectionFilteringInfo,
+        #endif
             environmentRadiance
         );
 

+ 6 - 0
src/Shaders/ShadersInclude/pbrBlockSheen.fx

@@ -65,6 +65,9 @@
                 const in sampler2D reflectionSamplerHigh,
             #endif
         #endif
+        #ifdef REALTIME_FILTERING
+            const in vec2 vReflectionFilteringInfo,
+        #endif
         #if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)
             const in float seo,
         #endif
@@ -167,6 +170,9 @@
                 reflectionSamplerLow,
                 reflectionSamplerHigh,
             #endif
+            #ifdef REALTIME_FILTERING
+                vReflectionFilteringInfo,
+            #endif
                 environmentSheenRadiance
             );
 

+ 7 - 0
src/Shaders/ShadersInclude/pbrBlockSubSurface.fx

@@ -43,6 +43,10 @@ struct subSurfaceOutParams
                 #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
                     const in vec3 irradianceVector_,
                 #endif
+                #if defined(REALTIME_FILTERING)
+                    const in samplerCube reflectionSampler,
+                    const in vec2 vReflectionFilteringInfo,
+                #endif
             #endif
             #ifdef USEIRRADIANCEMAP
                 #ifdef REFLECTIONMAP_3D
@@ -89,6 +93,9 @@ struct subSurfaceOutParams
         #ifdef ANISOTROPIC
             const in anisotropicOutParams anisotropicOut,
         #endif
+        #ifdef REALTIME_FILTERING
+            const in vec2 vRefractionFilteringInfo,
+        #endif
     #endif
     #ifdef SS_TRANSLUCENCY
         const in vec3 vDiffusionDistance,

+ 16 - 0
src/Shaders/pbr.fragment.fx

@@ -273,6 +273,9 @@ void main(void) {
             reflectionSamplerLow,
             reflectionSamplerHigh,
         #endif
+        #ifdef REALTIME_FILTERING
+            vReflectionFilteringInfo,
+        #endif
             reflectionOut
         );
     #endif
@@ -325,6 +328,9 @@ void main(void) {
                 reflectionSamplerLow,
                 reflectionSamplerHigh,
             #endif
+            #ifdef REALTIME_FILTERING
+                vReflectionFilteringInfo,
+            #endif
             #if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)
                 seo,
             #endif
@@ -406,6 +412,9 @@ void main(void) {
                 reflectionSamplerLow,
                 reflectionSamplerHigh,
             #endif
+            #ifdef REALTIME_FILTERING
+                vReflectionFilteringInfo,
+            #endif
         #endif
         #if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
             #ifdef RADIANCEOCCLUSION
@@ -445,6 +454,10 @@ void main(void) {
                     #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
                         reflectionOut.irradianceVector,
                     #endif
+                    #if defined(REALTIME_FILTERING)
+                        reflectionSampler,
+                        vReflectionFilteringInfo,
+                    #endif
                 #endif
                 #ifdef USEIRRADIANCEMAP
                     irradianceSampler,
@@ -479,6 +492,9 @@ void main(void) {
             #ifdef ANISOTROPIC
                 anisotropicOut,
             #endif
+            #ifdef REALTIME_FILTERING
+                vRefractionFilteringInfo,
+            #endif
         #endif
         #ifdef SS_TRANSLUCENCY
             vDiffusionDistance,