Selaa lähdekoodia

Allow different transformation matrices for sheen texture and textureRoughness

Popov72 4 vuotta sitten
vanhempi
commit
b8631302fd

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

@@ -243,6 +243,7 @@ export class PBRMaterialDefines extends MaterialDefines
     public SHEEN_TEXTURE = false;
     public SHEEN_TEXTURE_ROUGHNESS = false;
     public SHEEN_TEXTUREDIRECTUV = 0;
+    public SHEEN_TEXTURE_ROUGHNESSDIRECTUV = 0;
     public SHEEN_LINKWITHALBEDO = false;
     public SHEEN_ROUGHNESS = false;
     public SHEEN_ALBEDOSCALING = false;
@@ -2007,7 +2008,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
             this.subSurface.bindForSubMesh(ubo, scene, engine, this.isFrozen, defines.LODBASEDMICROSFURACE, this.realTimeFiltering);
             this.clearCoat.bindForSubMesh(ubo, scene, engine, this._disableBumpMap, this.isFrozen, this._invertNormalMapX, this._invertNormalMapY);
             this.anisotropy.bindForSubMesh(ubo, scene, this.isFrozen);
-            this.sheen.bindForSubMesh(ubo, scene, this.isFrozen);
+            this.sheen.bindForSubMesh(ubo, scene, this.isFrozen, subMesh);
 
             // Clip plane
             MaterialHelper.BindClipPlane(this._activeEffect, scene);

+ 20 - 8
src/Materials/PBR/pbrSheenConfiguration.ts

@@ -8,6 +8,7 @@ import { BaseTexture } from "../../Materials/Textures/baseTexture";
 import { Nullable } from "../../types";
 import { IAnimatable } from '../../Animations/animatable.interface';
 import { EffectFallbacks } from '../effectFallbacks';
+import { SubMesh } from '../../Meshes/subMesh';
 
 /**
  * @hidden
@@ -17,6 +18,7 @@ export interface IMaterialSheenDefines {
     SHEEN_TEXTURE: boolean;
     SHEEN_TEXTURE_ROUGHNESS: boolean;
     SHEEN_TEXTUREDIRECTUV: number;
+    SHEEN_TEXTURE_ROUGHNESSDIRECTUV: number;
     SHEEN_LINKWITHALBEDO: boolean;
     SHEEN_ROUGHNESS: boolean;
     SHEEN_ALBEDOSCALING: boolean;
@@ -163,7 +165,7 @@ export class PBRSheenConfiguration {
             defines.SHEEN_ROUGHNESS = this._roughness !== null;
             defines.SHEEN_ALBEDOSCALING = this._albedoScaling;
             defines.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE = this._useRoughnessFromMainTexture;
-            defines.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === this._textureRoughness?._texture;
+            defines.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL = this._texture !== null && this._texture._texture === this._textureRoughness?._texture && this._texture.checkTransformsAreIdentical(this._textureRoughness);
 
             if (defines._areTexturesDirty) {
                 if (scene.texturesEnabled) {
@@ -198,15 +200,24 @@ export class PBRSheenConfiguration {
      * @param uniformBuffer defines the Uniform buffer to fill in.
      * @param scene defines the scene the material belongs to.
      * @param isFrozen defines wether the material is frozen or not.
+     * @param subMesh the submesh to bind data for
      */
-    public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, isFrozen: boolean): void {
+    public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, isFrozen: boolean, subMesh?: SubMesh): void {
+        const defines = subMesh!._materialDefines as unknown as IMaterialSheenDefines;
+
+        const identicalTextures = defines.SHEEN_TEXTURE_ROUGHNESS_IDENTICAL;
+
         if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) {
-            if ((this._texture || this._textureRoughness) && MaterialFlags.SheenTextureEnabled) {
-                uniformBuffer.updateFloat4("vSheenInfos", this._texture?.coordinatesIndex ?? this._textureRoughness?.coordinatesIndex ?? 0, this._texture?.level ?? 0, 0 /* not used */, this._textureRoughness?.level ?? 0);
+            if (identicalTextures) {
+                uniformBuffer.updateFloat4("vSheenInfos", this._texture!.coordinatesIndex, this._texture!.level, -1, -1);
+                MaterialHelper.BindTextureMatrix(this._texture!, uniformBuffer, "sheen");
+            } else  if ((this._texture || this._textureRoughness) && MaterialFlags.SheenTextureEnabled) {
+                uniformBuffer.updateFloat4("vSheenInfos", this._texture?.coordinatesIndex ?? 0, this._texture?.level ?? 0, this._textureRoughness?.coordinatesIndex ?? 0, this._textureRoughness?.level ?? 0);
                 if (this._texture) {
                     MaterialHelper.BindTextureMatrix(this._texture, uniformBuffer, "sheen");
-                } else if (this._textureRoughness) {
-                    MaterialHelper.BindTextureMatrix(this._textureRoughness, uniformBuffer, "sheen");
+                }
+                if (this._textureRoughness && !identicalTextures && !defines.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE) {
+                    MaterialHelper.BindTextureMatrix(this._textureRoughness, uniformBuffer, "sheenRoughness");
                 }
             }
 
@@ -228,7 +239,7 @@ export class PBRSheenConfiguration {
                 uniformBuffer.setTexture("sheenSampler", this._texture);
             }
 
-            if (this._textureRoughness && (this._texture === null || this._texture._texture !== this._textureRoughness._texture) && MaterialFlags.SheenTextureEnabled) {
+            if (this._textureRoughness && !identicalTextures && !defines.SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE && MaterialFlags.SheenTextureEnabled) {
                 uniformBuffer.setTexture("sheenRoughnessSampler", this._textureRoughness);
             }
         }
@@ -317,7 +328,7 @@ export class PBRSheenConfiguration {
      * @param uniforms defines the current uniform list.
      */
     public static AddUniforms(uniforms: string[]): void {
-        uniforms.push("vSheenColor", "vSheenRoughness", "vSheenInfos", "sheenMatrix");
+        uniforms.push("vSheenColor", "vSheenRoughness", "vSheenInfos", "sheenMatrix", "sheenRoughnessMatrix");
     }
 
     /**
@@ -329,6 +340,7 @@ export class PBRSheenConfiguration {
         uniformBuffer.addUniform("vSheenRoughness", 1);
         uniformBuffer.addUniform("vSheenInfos", 4);
         uniformBuffer.addUniform("sheenMatrix", 16);
+        uniformBuffer.addUniform("sheenRoughnessMatrix", 16);
     }
 
     /**

+ 8 - 0
src/Materials/Textures/baseTexture.ts

@@ -474,6 +474,14 @@ export class BaseTexture implements IAnimatable {
     }
 
     /**
+     * Checks if the texture has the same transform matrix than another texture
+     * @param texture texture to check against
+     */
+    public checkTransformsAreIdentical(texture: Nullable<BaseTexture>): boolean {
+        return texture !== null;
+    }
+
+    /**
      * Get the texture transform matrix used to offset tile the texture for istance.
      * @returns the transformation matrix
      */

+ 15 - 0
src/Materials/Textures/texture.ts

@@ -445,6 +445,21 @@ export class Texture extends BaseTexture {
     }
 
     /**
+     * Checks if the texture has the same transform matrix than another texture
+     * @param texture texture to check against
+     */
+    public checkTransformsAreIdentical(texture: Nullable<Texture>): boolean {
+        return texture !== null &&
+                this.uOffset === texture.uOffset &&
+                this.vOffset === texture.vOffset &&
+                this.uScale === texture.uScale &&
+                this.vScale === texture.vScale &&
+                this.uAng === texture.uAng &&
+                this.vAng === texture.vAng &&
+                this.wAng === texture.wAng;
+    }
+
+    /**
      * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.
      * @returns the transform matrix of the texture.
      */

+ 5 - 3
src/Shaders/ShadersInclude/pbrBlockSheen.fx

@@ -25,7 +25,7 @@
         const in vec4 vSheenColor,
     #ifdef SHEEN_ROUGHNESS
         const in float vSheenRoughness,
-        #if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL)
+        #if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)
             const in vec4 sheenMapRoughnessData,
         #endif
     #endif
@@ -100,8 +100,10 @@
             
             #ifdef SHEEN_ROUGHNESS
                 float sheenRoughness = vSheenRoughness;
-                #if defined(SHEEN_TEXTURE) && defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)
-                    sheenRoughness *= sheenMapData.a;
+                #ifdef SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE
+                    #if defined(SHEEN_TEXTURE)
+                        sheenRoughness *= sheenMapData.a;
+                    #endif
                 #elif defined(SHEEN_TEXTURE_ROUGHNESS)
                     #ifdef SHEEN_TEXTURE_ROUGHNESS_IDENTICAL
                         sheenRoughness *= sheenMapData.a;

+ 8 - 1
src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx

@@ -108,10 +108,17 @@ uniform mat4 view;
         uniform float vSheenRoughness;
     #endif
 
-    #ifdef SHEEN_TEXTURE
+    #if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)
         uniform vec4 vSheenInfos;
+    #endif
+
+    #ifdef SHEEN_TEXTURE
         uniform mat4 sheenMatrix;
     #endif
+
+    #ifdef SHEEN_TEXTURE_ROUGHNESS
+        uniform mat4 sheenRoughnessMatrix;
+    #endif
 #endif
 
 // SubSurface

+ 11 - 1
src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx

@@ -129,7 +129,7 @@
 #endif
 
 #ifdef SHEEN
-    #if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)
+    #ifdef SHEEN_TEXTURE
         #if SHEEN_TEXTUREDIRECTUV == 1
             #define vSheenUV vMainUV1
         #elif SHEEN_TEXTUREDIRECTUV == 2
@@ -139,6 +139,16 @@
         #endif
     #endif
 
+    #ifdef SHEEN_TEXTURE_ROUGHNESS
+        #if SHEEN_TEXTURE_ROUGHNESSDIRECTUV == 1
+            #define vSheenRoughnessUV vMainUV1
+        #elif SHEEN_TEXTURE_ROUGHNESSDIRECTUV == 2
+            #define vSheenRoughnessUV vMainUV2
+        #else
+            varying vec2 vSheenRoughnessUV;
+        #endif
+    #endif
+
     #ifdef SHEEN_TEXTURE
         uniform sampler2D sheenSampler;
     #endif

+ 1 - 0
src/Shaders/ShadersInclude/pbrUboDeclaration.fx

@@ -58,6 +58,7 @@ uniform Material
     uniform float vSheenRoughness;
     uniform vec4 vSheenInfos;
     uniform mat4 sheenMatrix;
+    uniform mat4 sheenRoughnessMatrix;
 
     uniform vec3 vRefractionMicrosurfaceInfos;
     uniform vec2 vRefractionFilteringInfo;

+ 8 - 1
src/Shaders/ShadersInclude/pbrVertexDeclaration.fx

@@ -84,10 +84,17 @@ uniform float pointSize;
 
 // Sheen
 #ifdef SHEEN
-    #ifdef SHEEN_TEXTURE
+    #if defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)
         uniform vec4 vSheenInfos;
+    #endif
+
+    #ifdef SHEEN_TEXTURE
         uniform mat4 sheenMatrix;
     #endif
+
+    #ifdef SHEEN_TEXTURE_ROUGHNESS
+        uniform mat4 sheenRoughnessMatrix;
+    #endif
 #endif
 
 // Sub Surface

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

@@ -286,15 +286,15 @@ void main(void) {
         #ifdef SHEEN_TEXTURE
             vec4 sheenMapData = toLinearSpace(texture2D(sheenSampler, vSheenUV + uvOffset)) * vSheenInfos.y;
         #endif
-        #if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL)
-            vec4 sheenMapRoughnessData = texture2D(sheenRoughnessSampler, vSheenUV + uvOffset) * vSheenInfos.w;
+        #if defined(SHEEN_ROUGHNESS) && defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)
+            vec4 sheenMapRoughnessData = texture2D(sheenRoughnessSampler, vSheenRoughnessUV + uvOffset) * vSheenInfos.w;
         #endif
 
         sheenBlock(
             vSheenColor,
         #ifdef SHEEN_ROUGHNESS
             vSheenRoughness,
-            #if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL)
+            #if defined(SHEEN_TEXTURE_ROUGHNESS) && !defined(SHEEN_TEXTURE_ROUGHNESS_IDENTICAL) && !defined(SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE)
                 sheenMapRoughnessData,
             #endif
         #endif

+ 17 - 2
src/Shaders/pbr.vertex.fx

@@ -93,9 +93,13 @@ varying vec2 vBumpUV;
 #endif
 
 #ifdef SHEEN
-    #if (defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)) && SHEEN_TEXTUREDIRECTUV == 0 
+    #if defined(SHEEN_TEXTURE) && SHEEN_TEXTUREDIRECTUV == 0 
         varying vec2 vSheenUV;
     #endif
+
+    #if defined(SHEEN_TEXTURE_ROUGHNESS) && SHEEN_TEXTURE_ROUGHNESSDIRECTUV == 0 
+        varying vec2 vSheenRoughnessUV;
+    #endif
 #endif
 
 #ifdef ANISOTROPIC
@@ -386,7 +390,7 @@ void main(void) {
 #endif
 
 #ifdef SHEEN
-    #if (defined(SHEEN_TEXTURE) || defined(SHEEN_TEXTURE_ROUGHNESS)) && SHEEN_TEXTUREDIRECTUV == 0 
+    #if defined(SHEEN_TEXTURE) && SHEEN_TEXTUREDIRECTUV == 0 
         if (vSheenInfos.x == 0.)
         {
             vSheenUV = vec2(sheenMatrix * vec4(uvUpdated, 1.0, 0.0));
@@ -396,6 +400,17 @@ void main(void) {
             vSheenUV = vec2(sheenMatrix * vec4(uv2, 1.0, 0.0));
         }
     #endif
+
+    #if defined(SHEEN_TEXTURE_ROUGHNESS) && SHEEN_TEXTURE_ROUGHNESSDIRECTUV == 0 
+        if (vSheenInfos.z == 0.)
+        {
+            vSheenRoughnessUV = vec2(sheenRoughnessMatrix * vec4(uvUpdated, 1.0, 0.0));
+        }
+        else
+        {
+            vSheenRoughnessUV = vec2(sheenRoughnessMatrix * vec4(uv2, 1.0, 0.0));
+        }
+    #endif
 #endif
 
 #ifdef ANISOTROPIC