Browse Source

changed indirect lighting on lambert material so shadows arent pitch black when using hemispherical light

Tomasz Dysinski 6 years ago
parent
commit
bdf5fc2b2f

+ 17 - 2
src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js

@@ -13,8 +13,15 @@ backGeometry.viewDir = geometry.viewDir;
 
 vLightFront = vec3( 0.0 );
 
+#if defined (USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+	vAmbientLightFront = vec3( 0.0 );
+#endif
+
 #ifdef DOUBLE_SIDED
 	vLightBack = vec3( 0.0 );
+	#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+		vAmbientLightBack = vec3( 0.0 );
+	#endif
 #endif
 
 IncidentLight directLight;
@@ -103,11 +110,19 @@ vec3 directLightColor_Diffuse;
 	#pragma unroll_loop
 	for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 
-		vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
+		#ifdef USE_SHADOWMAP
+			vAmbientLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
+		#else
+			vLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );
+		#endif
 
 		#ifdef DOUBLE_SIDED
 
-			vLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );
+			#ifdef USE_SHADOWMAP
+				vAmbientLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );
+			#else
+				vLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );
+			#endif
 
 		#endif
 

+ 19 - 3
src/renderers/shaders/ShaderLib/meshlambert_frag.glsl.js

@@ -4,13 +4,18 @@ uniform vec3 emissive;
 uniform float opacity;
 
 varying vec3 vLightFront;
+#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+	varying vec3 vAmbientLightFront;
+#endif
 
 #ifdef DOUBLE_SIDED
-
 	varying vec3 vLightBack;
-
+	#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+		varying vec3 vAmbientLightBack;
+	#endif
 #endif
 
+
 #include <common>
 #include <packing>
 #include <dithering_pars_fragment>
@@ -51,6 +56,18 @@ void main() {
 	// accumulation
 	reflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );
 
+	#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+		#ifdef DOUBLE_SIDED
+
+			reflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vAmbientLightFront : vAmbientLightBack;
+
+		#else
+
+			reflectedLight.indirectDiffuse += vAmbientLightFront;
+
+		#endif
+	#endif
+
 	#include <lightmap_fragment>
 
 	reflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );
@@ -81,6 +98,5 @@ void main() {
 	#include <fog_fragment>
 	#include <premultiplied_alpha_fragment>
 	#include <dithering_fragment>
-
 }
 `;

+ 6 - 2
src/renderers/shaders/ShaderLib/meshlambert_vert.glsl.js

@@ -2,11 +2,15 @@ export default /* glsl */`
 #define LAMBERT
 
 varying vec3 vLightFront;
+#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+	varying vec3 vAmbientLightFront;
+#endif
 
 #ifdef DOUBLE_SIDED
-
 	varying vec3 vLightBack;
-
+	#if defined(USE_SHADOWMAP) && NUM_HEMI_LIGHTS > 0
+		varying vec3 vAmbientLightBack;
+	#endif
 #endif
 
 #include <common>