瀏覽代碼

Add logic to read transmission, translucency and thickness as defined by the glTF extensions

Michael Bond 4 年之前
父節點
當前提交
043c8d969b

+ 1 - 1
loaders/src/glTF/2.0/Extensions/KHR_materials_translucency.ts

@@ -86,7 +86,7 @@ export class KHR_materials_translucency implements IGLTFLoaderExtension {
             return this._loader.loadTextureInfoAsync(`${context}/translucencyTexture`, extension.translucencyTexture)
                 .then((texture: BaseTexture) => {
                     pbrMaterial.subSurface.thicknessTexture = texture;
-                    pbrMaterial.subSurface.useMaskFromThicknessTexture = true;
+                    pbrMaterial.subSurface.useMaskFromThicknessTextureGltf = true;
                 });
         } else {
             return Promise.resolve();

+ 1 - 1
loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts

@@ -328,7 +328,7 @@ export class KHR_materials_transmission implements IGLTFLoaderExtension {
             return this._loader.loadTextureInfoAsync(`${context}/transmissionTexture`, extension.transmissionTexture, undefined)
                 .then((texture: BaseTexture) => {
                     pbrMaterial.subSurface.thicknessTexture = texture;
-                    pbrMaterial.subSurface.useMaskFromThicknessTexture = true;
+                    pbrMaterial.subSurface.useMaskFromThicknessTextureGltf = true;
                 });
         } else {
             return Promise.resolve();

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

@@ -115,6 +115,7 @@ export class SubSurfaceBlock extends NodeMaterialBlock {
         defines.setValue("SS_TRANSLUCENCY", translucencyEnabled, true);
         defines.setValue("SS_THICKNESSANDMASK_TEXTURE", false, true);
         defines.setValue("SS_MASK_FROM_THICKNESS_TEXTURE", false, true);
+        defines.setValue("SS_MASK_FROM_THICKNESS_TEXTURE_GLTF", false, true);
     }
 
     /**

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

@@ -279,6 +279,7 @@ export class PBRMaterialDefines extends MaterialDefines
     public SS_ALBEDOFORREFRACTIONTINT = false;
 
     public SS_MASK_FROM_THICKNESS_TEXTURE = false;
+    public SS_MASK_FROM_THICKNESS_TEXTURE_GLTF = false;
 
     public UNLIT = false;
 

+ 13 - 0
src/Materials/PBR/pbrSubSurfaceConfiguration.ts

@@ -38,6 +38,7 @@ export interface IMaterialSubSurfaceDefines {
     SS_ALBEDOFORREFRACTIONTINT: boolean;
 
     SS_MASK_FROM_THICKNESS_TEXTURE: boolean;
+    SS_MASK_FROM_THICKNESS_TEXTURE_GLTF: boolean;
 
     /** @hidden */
     _areTexturesDirty: boolean;
@@ -242,6 +243,16 @@ export class PBRSubSurfaceConfiguration {
     public useMaskFromThicknessTexture: boolean = false;
 
     private _scene: Scene;
+    private _useMaskFromThicknessTextureGltf = false;
+    /**
+     * Stores the intensity of the different subsurface effects in the thickness texture. This variation
+     * matches the channel-packing that is used by glTF.
+     * * the red channel is the transmission/translucency intensity.
+     * * the green channel is the thickness.
+     */
+    @serialize()
+    @expandToProperty("_markAllSubMeshesAsTexturesDirty")
+    public useMaskFromThicknessTextureGltf: boolean = false;
 
     /** @hidden */
     private _internalMarkAllSubMeshesAsTexturesDirty: () => void;
@@ -309,6 +320,7 @@ export class PBRSubSurfaceConfiguration {
             defines.SS_SCATTERING = this._isScatteringEnabled;
             defines.SS_THICKNESSANDMASK_TEXTURE = false;
             defines.SS_MASK_FROM_THICKNESS_TEXTURE = false;
+            defines.SS_MASK_FROM_THICKNESS_TEXTURE_GLTF = false;
             defines.SS_REFRACTION = false;
             defines.SS_REFRACTIONMAP_3D = false;
             defines.SS_GAMMAREFRACTION = false;
@@ -331,6 +343,7 @@ export class PBRSubSurfaceConfiguration {
                 }
 
                 defines.SS_MASK_FROM_THICKNESS_TEXTURE = this._useMaskFromThicknessTexture;
+                defines.SS_MASK_FROM_THICKNESS_TEXTURE_GLTF = this._useMaskFromThicknessTextureGltf;
             }
 
             if (this._isRefractionEnabled) {

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

@@ -127,6 +127,13 @@ struct subSurfaceOutParams
             #ifdef SS_TRANSLUCENCY
                 translucencyIntensity *= thicknessMap.b;
             #endif
+        #elif defined(SS_MASK_FROM_THICKNESS_TEXTURE_GLTF)
+            #ifdef SS_REFRACTION
+                refractionIntensity *= thicknessMap.r;
+            #elif defined(SS_TRANSLUCENCY)
+                translucencyIntensity *= thicknessMap.r;
+            #endif
+            thickness = thicknessMap.g * vThicknessParam.y + vThicknessParam.x;
         #endif
     #else
         float thickness = vThicknessParam.y;