Przeglądaj źródła

remove punctual light approximation in physical lights.

Ben Houston 9 lat temu
rodzic
commit
6725d218d4

+ 15 - 2
examples/webgl_lights_physical.html

@@ -56,6 +56,8 @@
 
 			// ref for lumens: http://www.power-sure.com/lumens.htm
 			var bulbLuminousPowers = {
+				"110000 lm (1000W)": 110000,
+				"3500 lm (300W)": 3500,
 				"1700 lm (100W)": 1700,
 				"800 lm (60W)": 800,
 				"400 lm (40W)": 400,
@@ -80,7 +82,7 @@
 
 			var params = {
 				exposure: 1.0,
-				bulbPower: Object.keys( bulbLuminousPowers )[0],
+				bulbPower: Object.keys( bulbLuminousPowers )[3],
 				ambientIrradiance: Object.keys( ambientLuminousIrradiances )[0]
 			};
 
@@ -94,6 +96,13 @@
 
 				var container = document.getElementById( 'container' );
 
+				stats = new Stats();
+				stats.domElement.style.position = 'absolute';
+				stats.domElement.style.top = '0px';
+
+				container.appendChild( stats.domElement );
+
+
 				camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 100 );
 				camera.position.z = 7;
 				camera.position.y = 2;
@@ -259,9 +268,11 @@
 
 			function render() {
 
-				renderer.toneMappingExposure = params.exposure;
+				renderer.toneMappingExposure = Math.pow( params.exposure, 5.0 ); // to allow for very bright scenes.
+
 				bulbLight.power = bulbLuminousPowers[ params.bulbPower ];
 				bulbMat.emissiveIntensity = bulbLight.intensity / Math.pow( 0.02, 2.0 ); // convert from intensity to irradiance at bulb surface
+				
 				ambientLight.intensity = ambientLuminousIrradiances[ params.ambientIrradiance ];
 				var time = Date.now() * 0.0005;
 				var delta = clock.getDelta();
@@ -270,6 +281,8 @@
 
 				renderer.render( scene, camera );
 
+				stats.update();
+
 			}
 
 		</script>

+ 8 - 0
src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl

@@ -26,8 +26,16 @@ void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in Geometri
 
 	float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
 
+#if defined ( PHYSICAL_LIGHTS )
+
+	vec3 irradiance = dotNL * directLight.color;
+
+#else
+
 	vec3 irradiance = dotNL * PI * directLight.color; // punctual light
 
+#endif
+
 	reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
 	reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;
 

+ 8 - 0
src/renderers/shaders/ShaderChunk/lights_standard_pars_fragment.glsl

@@ -10,8 +10,16 @@ void RE_Direct_Standard( const in IncidentLight directLight, const in GeometricC
 
 	float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
 
+#if defined ( PHYSICAL_LIGHTS )
+
+	vec3 irradiance = dotNL * directLight.color;
+
+#else
+
 	vec3 irradiance = dotNL * PI * directLight.color; // punctual light
 
+#endif
+
 	reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
 
 	reflectedLight.directSpecular += irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );