Browse Source

Merge pull request #17163 from sunag/dev-energy-preservation

NodeMaterial: Added energy preservation flag
Mr.doob 6 năm trước cách đây
mục cha
commit
d4a7c788b5

+ 4 - 0
examples/jsm/nodes/materials/nodes/StandardNode.js

@@ -20,6 +20,8 @@ function StandardNode() {
 	this.roughness = new FloatNode( 0.5 );
 	this.metalness = new FloatNode( 0.5 );
 
+	this.energyPreservation = true;
+
 }
 
 StandardNode.prototype = Object.create( Node.prototype );
@@ -32,6 +34,8 @@ StandardNode.prototype.build = function ( builder ) {
 
 	builder.define( this.clearCoat || this.clearCoatRoughness ? 'PHYSICAL' : 'STANDARD' );
 
+	if ( this.energyPreservation ) builder.define( 'ENERGY_PRESERVATION' );
+
 	builder.requires.lights = true;
 
 	builder.extensions.shaderTextureLOD = true;

+ 2 - 0
src/materials/MeshStandardMaterial.d.ts

@@ -29,6 +29,7 @@ export interface MeshStandardMaterialParameters extends MaterialParameters {
 	alphaMap?: Texture;
 	envMap?: Texture;
 	envMapIntensity?: number;
+	energyPreservation: boolean;
 	refractionRatio?: number;
 	wireframe?: boolean;
 	wireframeLinewidth?: number;
@@ -66,6 +67,7 @@ export class MeshStandardMaterial extends Material {
 	alphaMap: Texture | null;
 	envMap: Texture | null;
 	envMapIntensity: number;
+	energyPreservation: boolean;
 	refractionRatio: number;
 	wireframe: boolean;
 	wireframeLinewidth: number;

+ 6 - 0
src/materials/MeshStandardMaterial.js

@@ -44,6 +44,8 @@ import { Color } from '../math/Color.js';
  *  envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
  *  envMapIntensity: <float>
  *
+ *  energyPreservation: <bool>,
+ *
  *  refractionRatio: <float>,
  *
  *  wireframe: <boolean>,
@@ -99,6 +101,8 @@ function MeshStandardMaterial( parameters ) {
 	this.envMap = null;
 	this.envMapIntensity = 1.0;
 
+	this.energyPreservation = true;
+
 	this.refractionRatio = 0.98;
 
 	this.wireframe = false;
@@ -161,6 +165,8 @@ MeshStandardMaterial.prototype.copy = function ( source ) {
 	this.envMap = source.envMap;
 	this.envMapIntensity = source.envMapIntensity;
 
+	this.energyPreservation = source.energyPreservation;
+
 	this.refractionRatio = source.refractionRatio;
 
 	this.wireframe = source.wireframe;

+ 2 - 2
src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js

@@ -98,7 +98,7 @@ void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricCo
 
 	// Defer to the IndirectSpecular function to compute
 	// the indirectDiffuse if energy preservation is enabled.
-	#ifndef ENVMAP_TYPE_CUBE_UV
+	#ifndef ENERGY_PRESERVATION
 
 		reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
 
@@ -120,7 +120,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
 
 	// Both indirect specular and diffuse light accumulate here
 	// if energy preservation enabled, and PMREM provided.
-	#if defined( ENVMAP_TYPE_CUBE_UV )
+	#if defined( ENERGY_PRESERVATION )
 
 		vec3 singleScattering = vec3( 0.0 );
 		vec3 multiScattering = vec3( 0.0 );

+ 2 - 0
src/renderers/webgl/WebGLProgram.js

@@ -527,6 +527,8 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 			parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',
 
+			parameters.energyPreservation ? '#define ENERGY_PRESERVATION' : '',
+
 			parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
 			parameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
 

+ 2 - 0
src/renderers/webgl/WebGLPrograms.js

@@ -205,6 +205,8 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 			toneMapping: renderer.toneMapping,
 			physicallyCorrectLights: renderer.physicallyCorrectLights,
 
+			energyPreservation: material.energyPreservation,
+
 			premultipliedAlpha: material.premultipliedAlpha,
 
 			alphaTest: material.alphaTest,