Prechádzať zdrojové kódy

Merge pull request #9370 from Popov72/nme-fix-reflection-invcubic

NME: Add support for inverse cubic reflection mode
David Catuhe 4 rokov pred
rodič
commit
3fd5a16725

+ 2 - 1
src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts

@@ -161,7 +161,8 @@ export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock {
         defines.setValue(this._defineLocalCubicName, (<any>texture).boundingBoxSize ? true : false, true);
         defines.setValue(this._defineExplicitName, texture.coordinatesMode === Constants.TEXTURE_EXPLICIT_MODE, true);
         defines.setValue(this._defineSkyboxName, texture.coordinatesMode === Constants.TEXTURE_SKYBOX_MODE, true);
-        defines.setValue(this._defineCubicName, texture.coordinatesMode === Constants.TEXTURE_CUBIC_MODE, true);
+        defines.setValue(this._defineCubicName, texture.coordinatesMode === Constants.TEXTURE_CUBIC_MODE || texture.coordinatesMode === Constants.TEXTURE_INVCUBIC_MODE, true);
+        defines.setValue("INVERTCUBICMAP", texture.coordinatesMode === Constants.TEXTURE_INVCUBIC_MODE, true);
         defines.setValue(this._defineSphericalName, texture.coordinatesMode === Constants.TEXTURE_SPHERICAL_MODE, true);
         defines.setValue(this._definePlanarName, texture.coordinatesMode === Constants.TEXTURE_PLANAR_MODE, true);
         defines.setValue(this._defineProjectionName, texture.coordinatesMode === Constants.TEXTURE_PROJECTION_MODE, true);

+ 6 - 1
src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts

@@ -941,6 +941,7 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock {
         state.sharedData.hints.needAlphaTesting = state.sharedData.hints.needAlphaTesting || this.useAlphaTest;
 
         state._emitExtension("lod", "#extension GL_EXT_shader_texture_lod : enable", "defined(LODBASEDMICROSFURACE)");
+        state._emitExtension("derivatives", "#extension GL_OES_standard_derivatives : enable");
 
         //
         // Includes
@@ -973,7 +974,11 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock {
         });
 
         state._emitFunctionFromInclude("pbrDirectLightingFalloffFunctions", comments);
-        state._emitFunctionFromInclude("pbrBRDFFunctions", comments);
+        state._emitFunctionFromInclude("pbrBRDFFunctions", comments, {
+            replaceStrings: [
+                { search: /REFLECTIONMAP_SKYBOX/g, replace: reflectionBlock?._defineSkyboxName ?? "REFLECTIONMAP_SKYBOX" }
+            ]
+        });
         state._emitFunctionFromInclude("hdrFilteringFunctions", comments);
 
         state._emitFunctionFromInclude("pbrDirectLightingFunctions", comments, {

+ 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},

+ 2 - 0
src/Materials/Node/nodeMaterialBuildState.ts

@@ -120,6 +120,8 @@ export class NodeMaterialBuildState {
             this.compilationString = `\r\n${emitComments ? "//Attributes\r\n" : ""}${this._attributeDeclaration}\r\n${this.compilationString}`;
         }
 
+        this.compilationString = "precision highp float;\r\n" + this.compilationString;
+
         for (var extensionName in this.extensions) {
             let extension = this.extensions[extensionName];
             this.compilationString = `\r\n${extension}\r\n${this.compilationString}`;

+ 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,

+ 2 - 2
src/Shaders/ShadersInclude/reflectionFunction.fx

@@ -81,7 +81,7 @@ vec3 computeCubicCoords(vec4 worldPos, vec3 worldNormal, vec3 eyePosition, mat4
 
     coords = vec3(reflectionMatrix * vec4(coords, 0));
 
-    #ifdef INVERTCUBICMAP // This is not (yet) supported by Node Material
+    #ifdef INVERTCUBICMAP
         coords.y *= -1.0;
     #endif
 
@@ -99,7 +99,7 @@ vec3 computeCubicLocalCoords(vec4 worldPos, vec3 worldNormal, vec3 eyePosition,
 
     coords = vec3(reflectionMatrix * vec4(coords, 0));
 
-    #ifdef INVERTCUBICMAP // This is not (yet) supported by Node Material
+    #ifdef INVERTCUBICMAP
         coords.y *= -1.0;
     #endif
 

+ 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,