Browse Source

refactor physical materials to use new BRDF+Light structs

Ben Houston 9 năm trước cách đây
mục cha
commit
95534e3cfe
1 tập tin đã thay đổi với 21 bổ sung60 xóa
  1. 21 60
      src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl

+ 21 - 60
src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl

@@ -1,8 +1,3 @@
-vec3 viewDir = normalize( vViewPosition );
-
-vec3 totalDiffuseLight = vec3( 0.0 );
-vec3 totalSpecularLight = vec3( 0.0 );
-
 
 // roughness linear remapping
 
@@ -16,32 +11,22 @@ vec3 specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );
 diffuseColor.rgb *= ( 1.0 - metalnessFactor );
 
 
-#if MAX_POINT_LIGHTS > 0
-
-	for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
-
-		vec3 lightColor = pointLightColor[ i ];
-
-		vec3 lightPosition = pointLightPosition[ i ];
-		vec3 lVector = lightPosition + vViewPosition.xyz;
-		vec3 lightDir = normalize( lVector );
 
-		// attenuation
+GeometricContext geometry = GeometricContext( -vViewPosition, normalize( normal ), normalize(vViewPosition ) );
 
-		float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );
+ReflectedLight directReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
+ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
 
-		// diffuse
 
-		float cosineTerm = saturate( dot( normal, lightDir ) );
-
-		totalDiffuseLight += lightColor * attenuation * cosineTerm;
+#if MAX_POINT_LIGHTS > 0
 
-		// specular
+	for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
 
-    	vec3 brdf = BRDF_GGX( specularColor, roughnessFactor, normal, lightDir, viewDir );
+		IncidentLight directLight = getPointDirectLight( pointLights[ i ], geometry );
 
-		totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;
+		BRDF_Lambert( directLight, geometry, diffuse, directReflectedLight );
 
+		BRDF_GGX( directLight, geometry, specularColor, roughnessFactor, directReflectedLight );
 
 	}
 
@@ -51,37 +36,11 @@ diffuseColor.rgb *= ( 1.0 - metalnessFactor );
 
 	for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {
 
-		vec3 lightColor = spotLightColor[ i ];
-
-		vec3 lightPosition = spotLightPosition[ i ];
-		vec3 lVector = lightPosition + vViewPosition.xyz;
-		vec3 lightDir = normalize( lVector );
-
-		float spotEffect = dot( spotLightDirection[ i ], lightDir );
-
-		if ( spotEffect > spotLightAngleCos[ i ] ) {
+		IncidentLight directLight = getSpotDirectLight( pointLights[ i ], geometry );
 
-			spotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );
+		BRDF_Lambert( directLight, geometry, diffuse, directReflectedLight );
 
-			// attenuation
-
-			float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );
-
-			attenuation *= spotEffect;
-
-			// diffuse
-
-			float cosineTerm = saturate( dot( normal, lightDir ) );
-
-			totalDiffuseLight += lightColor * attenuation * cosineTerm;
-
-			// specular
-
-    		vec3 brdf = BRDF_GGX( specularColor, roughnessFactor, normal, lightDir, viewDir );
-
-			totalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;
-
-		}
+		BRDF_GGX( directLight, geometry, specularColor, roughnessFactor, directReflectedLight );
 
 	}
 
@@ -91,21 +50,23 @@ diffuseColor.rgb *= ( 1.0 - metalnessFactor );
 
 	for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
 
-		vec3 lightColor = directionalLightColor[ i ];
+		IncidentLight directLight = getDirectionalDirectLight( pointLights[ i ], geometry );
 
-		vec3 lightDir = directionalLightDirection[ i ];
+		BRDF_Lambert( directLight, geometry, diffuse, directReflectedLight );
 
-		// diffuse
+		BRDF_GGX( directLight, geometry, specularColor, roughnessFactor, directReflectedLight );
 
-		float cosineTerm = saturate( dot( normal, lightDir ) );
+	}
+
+#endif
 
-		totalDiffuseLight += lightColor * cosineTerm;
+#if MAX_HEMI_LIGHTS > 0
 
-		// specular
+	for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
 
-    	vec3 brdf = BRDF_GGX( specularColor, roughnessFactor, normal, lightDir, viewDir );
+		IncidentLight indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], geometry );
 
-		totalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;
+		BRDF_Lambert( indirectLight, geometry, diffuse, indirectReflectedLight );
 
 	}