diff --git a/examples/webgpu_clipping.html b/examples/webgpu_clipping.html
index 39128b2865d219..90bf8022c60b5d 100644
--- a/examples/webgpu_clipping.html
+++ b/examples/webgpu_clipping.html
@@ -107,8 +107,6 @@
color: 0x80ee10,
shininess: 0,
side: THREE.DoubleSide,
-
- // ***** Clipping setup (material): *****
alphaToCoverage: true
} );
diff --git a/src/materials/nodes/NodeMaterial.js b/src/materials/nodes/NodeMaterial.js
index 5efbcbc3edc539..13f990fd320111 100644
--- a/src/materials/nodes/NodeMaterial.js
+++ b/src/materials/nodes/NodeMaterial.js
@@ -84,16 +84,6 @@ class NodeMaterial extends Material {
*/
this.lights = false;
- /**
- * Whether this material uses hardware clipping or not.
- * This property is managed by the engine and should not be
- * modified by apps.
- *
- * @type {boolean}
- * @default false
- */
- this.hardwareClipping = false;
-
/**
* Node materials which set their `lights` property to `true`
* are affected by all lights of the scene. Sometimes selective
@@ -656,7 +646,7 @@ class NodeMaterial extends Material {
*/
setupHardwareClipping( builder ) {
- this.hardwareClipping = false;
+ builder.hardwareClipping = false;
if ( builder.clippingContext === null ) return;
@@ -668,7 +658,7 @@ class NodeMaterial extends Material {
builder.stack.addToStack( hardwareClipping() );
- this.hardwareClipping = true;
+ builder.hardwareClipping = true;
}
diff --git a/src/nodes/accessors/ClippingNode.js b/src/nodes/accessors/ClippingNode.js
index 3c14e70508120b..8a2f072ea6c8cd 100644
--- a/src/nodes/accessors/ClippingNode.js
+++ b/src/nodes/accessors/ClippingNode.js
@@ -57,7 +57,7 @@ class ClippingNode extends Node {
const clippingContext = builder.clippingContext;
const { intersectionPlanes, unionPlanes } = clippingContext;
- this.hardwareClipping = builder.material.hardwareClipping;
+ this.hardwareClipping = builder.hardwareClipping;
if ( this.scope === ClippingNode.ALPHA_TO_COVERAGE ) {
diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js
index d35b66e0eb14a8..92084e93a64d93 100644
--- a/src/nodes/core/NodeBuilder.js
+++ b/src/nodes/core/NodeBuilder.js
@@ -216,6 +216,14 @@ class NodeBuilder {
*/
this.clippingContext = null;
+ /**
+ * Whether the built material uses hardware clipping or not.
+ *
+ * @type {boolean}
+ * @default false
+ */
+ this.hardwareClipping = false;
+
/**
* The generated vertex shader.
*
diff --git a/src/renderers/common/RenderObject.js b/src/renderers/common/RenderObject.js
index a50a9e62af6a71..f5a8db798ea18a 100644
--- a/src/renderers/common/RenderObject.js
+++ b/src/renderers/common/RenderObject.js
@@ -365,7 +365,7 @@ class RenderObject {
*/
get hardwareClippingPlanes() {
- return this.material.hardwareClipping === true ? this.clippingContext.unionClippingCount : 0;
+ return this.getNodeBuilderState().hardwareClipping === true ? this.clippingContext.unionClippingCount : 0;
}
diff --git a/src/renderers/common/nodes/NodeBuilderState.js b/src/renderers/common/nodes/NodeBuilderState.js
index d59209fb7fb114..5b7f90756cf485 100644
--- a/src/renderers/common/nodes/NodeBuilderState.js
+++ b/src/renderers/common/nodes/NodeBuilderState.js
@@ -23,9 +23,10 @@ class NodeBuilderState {
* @param {Array} updateBeforeNodes - An array of nodes that implement their `updateBefore()` method.
* @param {Array} updateAfterNodes - An array of nodes that implement their `updateAfter()` method.
* @param {NodeMaterialObserver} observer - A node material observer.
+ * @param {boolean} hardwareClipping - Whether the built material uses hardware clipping or not.
* @param {Array