diff --git a/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl b/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl index 5275a780c3e47141f176230fee249272fc047b24..20e4092c7284ed16538d95f7fb3a47793c72b166 100644 --- a/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl +++ b/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 ); }