提交 95534e3c 编写于 作者: B Ben Houston

refactor physical materials to use new BRDF+Light structs

上级 a101882d
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 );
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册