Selaa lähdekoodia

NodeMaterial: Material.onUpdate() (#22417)

* move to webgl/nodes

* Add Material.onUpdate()

* WebGLNodes: normal, opacity, emissive, roughness, metalness, clearcoat, clearcoatRoughness

* update node per frame

* remove unnecessary nodeFrame update

* Renamed Material.onUpdate() -> Material.onBeforeRender()
sunag 3 vuotta sitten
vanhempi
commit
53e3d53d1f

+ 1 - 3
examples/jsm/renderers/webgl/nodes/WebGLNodes.js

@@ -12,14 +12,12 @@ Material.prototype.onBuild = function ( parameters, renderer ) {
 
 };
 
-Material.prototype.onUpdate = function ( renderer, scene, camera, geometry, object ) {
+Material.prototype.onBeforeRender = function ( renderer, scene, camera, geometry, object ) {
 
 	const nodeBuilder = builders.get( this );
 
 	if ( nodeBuilder !== undefined ) {
 
-		nodeFrame.update();
-
 		nodeFrame.material = this;
 		nodeFrame.camera = camera;
 		nodeFrame.object = object;

+ 5 - 2
examples/webgl_materials_standard_nodes.html

@@ -31,12 +31,13 @@
 			import { OBJLoader } from './jsm/loaders/OBJLoader.js';
 			import { RGBELoader } from './jsm/loaders/RGBELoader.js';
 
-			import './jsm/renderers/webgl/nodes/WebGLNodes.js';
+			import { nodeFrame } from './jsm/renderers/webgl/nodes/WebGLNodes.js';
 
 			import TextureNode from './jsm/renderers/nodes/inputs/TextureNode.js';
 			import Vector3Node from './jsm/renderers/nodes/inputs/Vector3Node.js';
 			import OperatorNode from './jsm/renderers/nodes/math/OperatorNode.js';
 			import SwitchNode from './jsm/renderers/nodes/utils/SwitchNode.js';
+			import NormalMapNode from './jsm/renderers/nodes/display/NormalMapNode.js';
 
 			let container, stats;
 
@@ -101,7 +102,7 @@
 						material.roughnessNode = new SwitchNode( mpMapNode, 'g' );
 						material.metalnessNode = new SwitchNode( mpMapNode, 'b' );
 
-						material.normalMap = normalMap;
+						material.normalNode = new NormalMapNode( new TextureNode( normalMap ) );
 
 						group.traverse( function ( child ) {
 
@@ -197,6 +198,8 @@
 
 				requestAnimationFrame( animate );
 
+				nodeFrame.update();
+
 				controls.update();
 				renderer.render( scene, camera );
 

+ 2 - 0
src/materials/Material.js

@@ -98,6 +98,8 @@ class Material extends EventDispatcher {
 
 	onBuild( /* shaderobject, renderer */ ) {}
 
+	onBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}
+
 	onBeforeCompile( /* shaderobject, renderer */ ) {}
 
 	customProgramCacheKey() {

+ 2 - 0
src/renderers/WebGLRenderer.js

@@ -1335,6 +1335,8 @@ function WebGLRenderer( parameters = {} ) {
 		object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
 		object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
 
+		material.onBeforeRender( _this, scene, camera, geometry, object, group );
+
 		if ( object.isImmediateRenderObject ) {
 
 			const program = setProgram( camera, scene, material, object );