瀏覽代碼

WebGPURenderer: Manage `hardwareClipping` on builder level. (#33681)

Michael Herzog 2 周之前
父節點
當前提交
6a83d783c4

+ 0 - 2
examples/webgpu_clipping.html

@@ -107,8 +107,6 @@
 					color: 0x80ee10,
 					shininess: 0,
 					side: THREE.DoubleSide,
-
-					// ***** Clipping setup (material): *****
 					alphaToCoverage: true
 				} );
 

+ 2 - 12
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;
 
 		}
 

+ 1 - 1
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 ) {
 

+ 8 - 0
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.
 		 *

+ 1 - 1
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;
 
 	}
 

+ 9 - 1
src/renderers/common/nodes/NodeBuilderState.js

@@ -23,9 +23,10 @@ class NodeBuilderState {
 	 * @param {Array<Node>} updateBeforeNodes - An array of nodes that implement their `updateBefore()` method.
 	 * @param {Array<Node>} 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<Object>} transforms - An array with transform attribute objects. Only relevant when using compute shaders with WebGL 2.
 	 */
-	constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, transforms = [] ) {
+	constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, hardwareClipping, transforms = [] ) {
 
 		/**
 		 * The native vertex shader code.
@@ -100,6 +101,13 @@ class NodeBuilderState {
 		 */
 		this.observer = observer;
 
+		/**
+		 * Whether the built material uses hardware clipping or not.
+		 *
+		 * @type {boolean}
+		 */
+		this.hardwareClipping = hardwareClipping;
+
 		/**
 		 * How often this state is used by render objects.
 		 *

+ 1 - 0
src/renderers/common/nodes/NodeManager.js

@@ -483,6 +483,7 @@ class NodeManager extends DataMap {
 			nodeBuilder.updateBeforeNodes,
 			nodeBuilder.updateAfterNodes,
 			nodeBuilder.observer,
+			nodeBuilder.hardwareClipping,
 			nodeBuilder.transforms
 		);
 

粤ICP备19079148号