|
@@ -3,22 +3,19 @@ vec3 diffuse = vec3( 1.0 );
|
|
|
GeometricContext geometry = GeometricContext( mvPosition.xyz, normalize( transformedNormal ), normalize( -mvPosition.xyz ) );
|
|
|
GeometricContext backGeometry = GeometricContext( geometry.position, -geometry.normal, geometry.viewDir );
|
|
|
|
|
|
-ReflectedLight frontReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
|
|
|
-ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
|
|
|
-
|
|
|
#if MAX_POINT_LIGHTS > 0
|
|
|
|
|
|
for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
|
|
|
|
|
|
IncidentLight directLight = getPointDirectLight( pointLights[ i ], geometry );
|
|
|
|
|
|
- float dotNL = dot( geometry.normal, directLight.direction );
|
|
|
- frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
+ float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
|
|
|
+ vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
|
|
|
#ifdef DOUBLE_SIDED
|
|
|
|
|
|
- float dotNLBack = dot( -geometry.normal, directLight.direction );
|
|
|
- backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
+ float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
|
|
|
+ vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
|
|
|
#endif
|
|
|
|
|
@@ -32,13 +29,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
|
|
|
|
|
|
IncidentLight directLight = getSpotDirectLight( spotLights[ i ], geometry );
|
|
|
|
|
|
- float dotNL = dot( geometry.normal, directLight.direction );
|
|
|
- frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
+ float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
|
|
|
+ vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
|
|
|
#ifdef DOUBLE_SIDED
|
|
|
|
|
|
- float dotNLBack = dot( -geometry.normal, directLight.direction );
|
|
|
- backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
+ float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
|
|
|
+ vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
|
|
|
#endif
|
|
|
}
|
|
@@ -51,13 +48,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
|
|
|
|
|
|
IncidentLight directLight = getDirectionalDirectLight( directionalLights[ i ], geometry );
|
|
|
|
|
|
- float dotNL = dot( geometry.normal, directLight.direction );
|
|
|
- frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
+ float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
|
|
|
+ vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
|
|
|
#ifdef DOUBLE_SIDED
|
|
|
|
|
|
- float dotNLBack = dot( -geometry.normal, directLight.direction );
|
|
|
- backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
+ float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
|
|
|
+ vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
|
|
|
#endif
|
|
|
|
|
@@ -65,32 +62,45 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
-#if MAX_HEMI_LIGHTS > 0
|
|
|
+ {
|
|
|
+
|
|
|
+ IncidentLight frontIndirectLight;
|
|
|
+ frontIndirectLight.direction = geometry.normal;
|
|
|
+ frontIndirectLight.color = ambientLightColor;
|
|
|
|
|
|
- for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
|
|
|
+ #ifdef DOUBLE_SIDED
|
|
|
+
|
|
|
+ IncidentLight backIndirectLight;
|
|
|
+ backIndirectLight.direction = -geometry.normal;
|
|
|
+ backIndirectLight.color = ambientLightColor;
|
|
|
|
|
|
- IncidentLight indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], geometry );
|
|
|
+ #endif
|
|
|
|
|
|
- float dotNL = dot( geometry.normal, directLight.direction );
|
|
|
- frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
|
|
|
+ #if MAX_HEMI_LIGHTS > 0
|
|
|
|
|
|
- #ifdef DOUBLE_SIDED
|
|
|
-
|
|
|
- indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry );
|
|
|
+ for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
|
|
|
|
|
|
- float dotNLBack = dot( -geometry.normal, directLight.direction );
|
|
|
- backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
|
|
|
+ frontIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], geometry ).color;
|
|
|
|
|
|
- #endif
|
|
|
|
|
|
- }
|
|
|
+ #ifdef DOUBLE_SIDED
|
|
|
+
|
|
|
+ backIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry ).color;
|
|
|
|
|
|
-#endif
|
|
|
+ #endif
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
-vLightFront = frontReflectedLight.diffuse;
|
|
|
+ #endif
|
|
|
|
|
|
-#ifdef DOUBLE_SIDED
|
|
|
+ float frontDotNL = saturate( dot( geometry.normal, frontIndirectLight.direction ) );
|
|
|
+ vLightFront += frontDotNL * frontIndirectLight.color * BRDF_Diffuse_Lambert( frontIndirectLight, geometry, diffuse );
|
|
|
|
|
|
- vLightBack = backReflectedLight.diffuse;
|
|
|
+ #ifdef DOUBLE_SIDED
|
|
|
+
|
|
|
+ float backDotNL = saturate( dot( -geometry.normal, backIndirectLight.direction ) );
|
|
|
+ vLightBack += backDotNL * backIndirectLight.color * BRDF_Diffuse_Lambert( backIndirectLight, backGeometry, diffuse );
|
|
|
+
|
|
|
+ #endif
|
|
|
|
|
|
-#endif
|
|
|
+ }
|