Bläddra i källkod

MeshBasicNodeMaterial: Add `lightMap` support. (#28821)

Michael Herzog 1 år sedan
förälder
incheckning
bde222e3cb

+ 23 - 2
src/nodes/functions/BasicLightingModel.js

@@ -3,6 +3,7 @@ import { diffuseColor } from '../core/PropertyNode.js';
 import { MultiplyOperation, MixOperation, AddOperation } from '../../constants.js';
 import { materialSpecularStrength, materialReflectivity } from '../accessors/MaterialNode.js';
 import { mix } from '../math/MathNode.js';
+import { vec4 } from '../shadernode/ShaderNode.js';
 
 class BasicLightingModel extends LightingModel {
 
@@ -12,12 +13,32 @@ class BasicLightingModel extends LightingModel {
 
 	}
 
-	indirect( { ambientOcclusion, reflectedLight } ) {
+	indirect( context, stack, builder ) {
 
-		reflectedLight.indirectDiffuse.addAssign( diffuseColor.rgb );
+		const ambientOcclusion = context.ambientOcclusion;
+		const reflectedLight = context.reflectedLight;
+		const irradianceLightMap = builder.context.irradianceLightMap;
+
+		reflectedLight.indirectDiffuse.assign( vec4( 0.0 ) );
+
+		// accumulation (baked indirect lighting only)
+
+		if ( irradianceLightMap ) {
+
+			reflectedLight.indirectDiffuse.addAssign( irradianceLightMap );
+
+		} else {
+
+			reflectedLight.indirectDiffuse.addAssign( vec4( 1.0, 1.0, 1.0, 0.0 ) );
+
+		}
+
+		// modulation
 
 		reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );
 
+		reflectedLight.indirectDiffuse.mulAssign( diffuseColor.rgb );
+
 	}
 
 	finish( context, stack, builder ) {

+ 29 - 0
src/nodes/lighting/BasicLightMapNode.js

@@ -0,0 +1,29 @@
+import LightingNode from './LightingNode.js';
+import { addNodeClass } from '../core/Node.js';
+import { float } from '../shadernode/ShaderNode.js';
+
+class BasicLightMapNode extends LightingNode {
+
+	constructor( lightMapNode = null ) {
+
+		super();
+
+		this.lightMapNode = lightMapNode;
+
+	}
+
+	setup( builder ) {
+
+		// irradianceLightMap property is used in the indirectDiffuse() method of BasicLightingModel
+
+		const RECIPROCAL_PI = float( 1 / Math.PI );
+
+		builder.context.irradianceLightMap = this.lightMapNode.mul( RECIPROCAL_PI );
+
+	}
+
+}
+
+export default BasicLightMapNode;
+
+addNodeClass( 'BasicLightMapNode', BasicLightMapNode );

+ 16 - 0
src/nodes/materials/MeshBasicNodeMaterial.js

@@ -1,6 +1,8 @@
 import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
+import { materialLightMap } from '../accessors/MaterialNode.js';
 import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
 import BasicEnvironmentNode from '../lighting/BasicEnvironmentNode.js';
+import BasicLightMapNode from '../lighting/BasicLightMapNode.js';
 import BasicLightingModel from '../functions/BasicLightingModel.js';
 
 const defaultValues = new MeshBasicMaterial();
@@ -30,6 +32,20 @@ class MeshBasicNodeMaterial extends NodeMaterial {
 
 	}
 
+	setupLightMap( builder ) {
+
+		let node = null;
+
+		if ( builder.material.lightMap ) {
+
+			node = new BasicLightMapNode( materialLightMap );
+
+		}
+
+		return node;
+
+	}
+
 	setupLightingModel() {
 
 		return new BasicLightingModel();

+ 18 - 2
src/nodes/materials/NodeMaterial.js

@@ -351,6 +351,20 @@ class NodeMaterial extends Material {
 
 	}
 
+	setupLightMap( builder ) {
+
+		let node = null;
+
+		if ( builder.material.lightMap ) {
+
+			node = new IrradianceNode( materialLightMap );
+
+		}
+
+		return node;
+
+	}
+
 	setupLights( builder ) {
 
 		const materialLightsNode = [];
@@ -365,9 +379,11 @@ class NodeMaterial extends Material {
 
 		}
 
-		if ( builder.material.lightMap ) {
+		const lightMapNode = this.setupLightMap( builder );
+
+		if ( lightMapNode && lightMapNode.isLightingNode ) {
 
-			materialLightsNode.push( new IrradianceNode( materialLightMap ) );
+			materialLightsNode.push( lightMapNode );
 
 		}