diff --git a/docs/api/en/materials/MeshPhysicalMaterial.html b/docs/api/en/materials/MeshPhysicalMaterial.html
index eae40c0e3ccf4d..b8099aad156c67 100644
--- a/docs/api/en/materials/MeshPhysicalMaterial.html
+++ b/docs/api/en/materials/MeshPhysicalMaterial.html
@@ -61,7 +61,6 @@
Examples
[example:webgl_materials_variations_physical materials / variations / physical]
[example:webgl_materials_physical_clearcoat materials / physical / clearcoat]
[example:webgl_materials_physical_reflectivity materials / physical / reflectivity]
- [example:webgl_materials_physical_sheen materials / physical / sheen]
[example:webgl_materials_physical_transmission materials / physical / transmission]
diff --git a/docs/api/zh/materials/MeshPhysicalMaterial.html b/docs/api/zh/materials/MeshPhysicalMaterial.html
index b360eeea8095a2..49511c412d76e9 100644
--- a/docs/api/zh/materials/MeshPhysicalMaterial.html
+++ b/docs/api/zh/materials/MeshPhysicalMaterial.html
@@ -62,7 +62,6 @@ 例子
[example:webgl_materials_variations_physical materials / variations / physical]
[example:webgl_materials_physical_clearcoat materials / physical / clearcoat]
[example:webgl_materials_physical_reflectivity materials / physical / reflectivity]
- [example:webgl_materials_physical_sheen materials / physical / sheen]
[example:webgl_materials_physical_transmission materials / physical / transmission]
diff --git a/examples/files.json b/examples/files.json
index 5c3cc6c2543b46..a803fa908f8a4d 100644
--- a/examples/files.json
+++ b/examples/files.json
@@ -84,6 +84,7 @@
"webgl_loader_gcode",
"webgl_loader_gltf",
"webgl_loader_gltf_compressed",
+ "webgl_loader_gltf_sheen",
"webgl_loader_gltf_transmission",
"webgl_loader_gltf_variants",
"webgl_loader_ifc",
@@ -146,7 +147,6 @@
"webgl_materials_normalmap_object_space",
"webgl_materials_physical_clearcoat",
"webgl_materials_physical_reflectivity",
- "webgl_materials_physical_sheen",
"webgl_materials_physical_transmission",
"webgl_materials_standard",
"webgl_materials_subsurface_scattering",
diff --git a/examples/jsm/loaders/GLTFLoader.js b/examples/jsm/loaders/GLTFLoader.js
index 3e95e5391d5bf3..de743b8bf96c13 100644
--- a/examples/jsm/loaders/GLTFLoader.js
+++ b/examples/jsm/loaders/GLTFLoader.js
@@ -94,6 +94,12 @@ class GLTFLoader extends Loader {
} );
+ this.register( function ( parser ) {
+
+ return new GLTFMaterialsSheenExtension( parser );
+
+ } );
+
this.register( function ( parser ) {
return new GLTFMaterialsTransmissionExtension( parser );
@@ -428,6 +434,7 @@ const EXTENSIONS = {
KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
KHR_MATERIALS_IOR: 'KHR_materials_ior',
KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
+ KHR_MATERIALS_SHEEN: 'KHR_materials_sheen',
KHR_MATERIALS_SPECULAR: 'KHR_materials_specular',
KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
@@ -704,6 +711,70 @@ class GLTFMaterialsClearcoatExtension {
}
+/**
+ * Sheen Materials Extension
+ *
+ * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen
+ */
+class GLTFMaterialsSheenExtension {
+
+ constructor( parser ) {
+
+ this.parser = parser;
+ this.name = EXTENSIONS.KHR_MATERIALS_SHEEN;
+
+ }
+
+ getMaterialType( materialIndex ) {
+
+ const parser = this.parser;
+ const materialDef = parser.json.materials[ materialIndex ];
+
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
+
+ return MeshPhysicalMaterial;
+
+ }
+
+ extendMaterialParams( materialIndex, materialParams ) {
+
+ const parser = this.parser;
+ const materialDef = parser.json.materials[ materialIndex ];
+
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
+
+ return Promise.resolve();
+
+ }
+
+ const pending = [];
+
+ materialParams.sheenTint = new Color( 0, 0, 0 );
+ materialParams.sheenRoughness = 0;
+ materialParams.sheen = 1;
+
+ const extension = materialDef.extensions[ this.name ];
+
+ if ( extension.sheenColorFactor !== undefined ) {
+
+ materialParams.sheenTint.fromArray( extension.sheenColorFactor );
+
+ }
+
+ if ( extension.sheenRoughnessFactor !== undefined ) {
+
+ materialParams.sheenRoughness = extension.sheenRoughnessFactor;
+
+ }
+
+ // TODO sheenColorTexture and sheenRoughnessTexture
+
+ return Promise.all( pending );
+
+ }
+
+}
+
/**
* Transmission Materials Extension
*
diff --git a/examples/models/fbx/cloth.fbx b/examples/models/fbx/cloth.fbx
deleted file mode 100644
index 91b5858c218491..00000000000000
Binary files a/examples/models/fbx/cloth.fbx and /dev/null differ
diff --git a/examples/models/gltf/SheenChair.glb b/examples/models/gltf/SheenChair.glb
new file mode 100644
index 00000000000000..b17772fdb79c56
Binary files /dev/null and b/examples/models/gltf/SheenChair.glb differ
diff --git a/examples/screenshots/webgl_loader_gltf_sheen.jpg b/examples/screenshots/webgl_loader_gltf_sheen.jpg
new file mode 100644
index 00000000000000..bbfa0e1b341a53
Binary files /dev/null and b/examples/screenshots/webgl_loader_gltf_sheen.jpg differ
diff --git a/examples/screenshots/webgl_materials_physical_sheen.jpg b/examples/screenshots/webgl_materials_physical_sheen.jpg
deleted file mode 100644
index f627b5d8ff1c63..00000000000000
Binary files a/examples/screenshots/webgl_materials_physical_sheen.jpg and /dev/null differ
diff --git a/examples/webgl_loader_gltf_sheen.html b/examples/webgl_loader_gltf_sheen.html
new file mode 100644
index 00000000000000..27d807d7a19ecd
--- /dev/null
+++ b/examples/webgl_loader_gltf_sheen.html
@@ -0,0 +1,113 @@
+
+
+
+ three.js webgl - glTF 2.0 - transmission
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/webgl_materials_physical_sheen.html b/examples/webgl_materials_physical_sheen.html
deleted file mode 100644
index 7b67daa2a230f8..00000000000000
--- a/examples/webgl_materials_physical_sheen.html
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
- Sheen demo (material property)
-
-
-
-
-
-
-
-
-
-
-
-
-