Skip to content

Commit

Permalink
feat: simplify BRDF to exclude incoming irradiance
Browse files Browse the repository at this point in the history
  • Loading branch information
bhouston committed Jul 3, 2020
1 parent 61f95b6 commit c06ea81
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 35 deletions.
Binary file added assets/AutodeskStandardSurface_Guide.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 6 additions & 2 deletions src/examples/brdfs/01_lambert/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ uniform sampler2D albedoMap;

void main() {

vec3 ambient = vec3(0.0);
vec3 albedo = albedoModulator * sRGBToLinear( texture2D( albedoMap, v_uv0 ).rgb );

PunctualLight punctualLight;
Expand All @@ -36,8 +37,11 @@ void main() {
DirectIllumination directIllumination;
pointLightToDirectIllumination( surface, punctualLight, directIllumination );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
10 changes: 7 additions & 3 deletions src/examples/brdfs/02_specular/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ uniform sampler2D specularRoughnessMap;

void main() {

vec3 ambient = vec3( 0.0 );
vec3 albedo = albedoModulator * sRGBToLinear( texture2D( albedoMap, v_uv0 ).rgb );
vec3 specular = specularModulator * vec3( length( texture2D( specularMap, v_uv0 ).rgb ) );
float specularRoughness = specularRoughnessModulator * sRGBToLinear( texture2D( specularRoughnessMap, v_uv0 ).rgb ).r;
vec3 F0 = ( specular * specular ) * 0.16;
vec3 specularF0 = ( specular * specular ) * 0.16;

Surface surface;
surface.position = v_viewSurfacePosition;
Expand All @@ -41,9 +42,12 @@ void main() {
DirectIllumination directIllumination;
pointLightToDirectIllumination( surface, punctualLight, directIllumination );

vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Specular_GGX( directIllumination, surface, F0, specularRoughness );
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
10 changes: 7 additions & 3 deletions src/examples/brdfs/03_specularAnisotropic/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ uniform sampler2D specularAnisotropicFlowMap;

void main() {

vec3 ambient = vec3(0.0);
vec3 albedo = vec3( 1.0 );
vec3 specular = vec3( 1.0 );
float specularRoughness = 0.25;
vec2 specularAnisotropicFlow = specularAnisotropicFlowModulator * decodeAnisotropyFlowMap( texture2D( specularAnisotropicFlowMap, v_uv0 ) );
vec3 F0 = ( specular * specular ) * 0.16;
vec3 specularF0 = ( specular * specular ) * 0.16;

Surface surface;
surface.position = v_viewSurfacePosition;
Expand All @@ -44,9 +45,12 @@ void main() {

specularAnisotropicBentNormal( surface, length( specularAnisotropicFlow ), specularRoughness );

vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Specular_GGX( directIllumination, surface, F0, specularRoughness );
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
10 changes: 6 additions & 4 deletions src/examples/brdfs/04_normals/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ void main() {
vec3 albedo = vec3(1.0,1.0,1.0);
vec3 specular = vec3(1.0);
float specularRoughness = 0.25;
vec3 F0 = ( specular * specular ) * 0.16;
vec3 specularF0 = ( specular * specular ) * 0.16;

vec3 normal = vec3( normalModulator, 1.0 ) * ( texture2D( normalMap, v_uv0 ).grb * 2.0 - 1.0 );

Expand All @@ -44,10 +44,12 @@ void main() {
DirectIllumination directIllumination;
pointLightToDirectIllumination( surface, punctualLight, directIllumination );

vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Specular_GGX( directIllumination, surface, F0, specularRoughness );
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
outputColor += BRDF_Ambient_Basic( ambient, albedo );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
20 changes: 12 additions & 8 deletions src/examples/brdfs/05_bump/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,20 @@ uniform sampler2D specularRoughnessMap;
#pragma include <color/spaces/srgb>

void main() {
vec2 uv = v_uv0 * 0.5;
vec3 albedo = sRGBToLinear( texture2D( albedoMap, uv ).rgb );

vec3 ambient = vec3(0.0);
vec3 albedo = sRGBToLinear( texture2D( albedoMap, v_uv0 ).rgb );
vec3 specular = vec3(1.0);
float specularRoughness = texture2D( specularRoughnessMap, uv ).r;
vec3 F0 = ( specular * specular ) * 0.16;
float specularRoughness = texture2D( specularRoughnessMap, v_uv0 ).r;
vec3 specularF0 = ( specular * specular ) * 0.16;

Surface surface;
surface.position = v_viewSurfacePosition;
surface.normal = normalize( v_viewSurfaceNormal );
surface.viewDirection = normalize( -v_viewSurfacePosition );

uvToTangentFrame( surface, uv );
perturbSurfaceNormal_BumpMap( surface, bumpMap, uv, 4.0 );
uvToTangentFrame( surface, v_uv0 );
perturbSurfaceNormal_BumpMap( surface, bumpMap, v_uv0, 4.0 );

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
Expand All @@ -42,9 +43,12 @@ void main() {
DirectIllumination directIllumination;
pointLightToDirectIllumination( surface, punctualLight, directIllumination );

vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Specular_GGX( directIllumination, surface, F0, specularRoughness );
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
2 changes: 1 addition & 1 deletion src/examples/brdfs/05_bump/vertex.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ void main() {

v_viewSurfaceNormal = normalize( ( worldToView * localToWorld * vec4( normalize( position ), 0.0 ) ).xyz );
v_viewSurfacePosition = ( worldToView * localToWorld * vec4( position, 1.0 ) ).xyz;
v_uv0 = uv;
v_uv0 = uv * 0.5;
gl_Position = viewToScreen * vec4( v_viewSurfacePosition, 1.0 );

}
10 changes: 6 additions & 4 deletions src/examples/brdfs/06_clearcoat/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,13 @@ void main() {
DirectIllumination directIllumination;
pointLightToDirectIllumination( surface, punctualLight, directIllumination );

vec3 lightDirection = directIllumination.lightDirection;
vec3 irradiance = directIllumination.color * saturate( dot( surface.normal, lightDirection ) );

vec3 outputColor = vec3(0.0);
outputColor += BRDF_Specular_GGX( directIllumination, clearCoatSurface, clearCoatF0, clearCoatRoughness );
outputColor += BRDF_Specular_GGX( directIllumination, surface, specularF0, specularRoughness );
outputColor += BRDF_Diffuse_Lambert( directIllumination, surface, albedo );
outputColor += BRDF_Ambient_Basic( ambient, albedo );
outputColor += irradiance * BRDF_Specular_GGX( clearCoatSurface, lightDirection, clearCoatF0, clearCoatRoughness );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += ( irradiance + ambient ) * BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.a = 1.0;
Expand Down
6 changes: 1 addition & 5 deletions src/lib/shaders/includes/brdfs/diffuse/lambert.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,9 @@

// three.js
vec3 BRDF_Diffuse_Lambert(
const in DirectIllumination directIllumination,
const in Surface surface,
const in vec3 albedo ) {

float dotNL = saturate( dot( directIllumination.lightDirection, surface.normal ) );

return dotNL * directIllumination.color * albedo * RECIPROCAL_PI;
return albedo * RECIPROCAL_PI;

} // validated

Expand Down
10 changes: 5 additions & 5 deletions src/lib/shaders/includes/brdfs/specular/ggx.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@
#pragma include "d_ggx"

// GGX Distribution, Schlick Fresnel, GGX-Smith Visibility
vec3 BRDF_Specular_GGX( const in DirectIllumination directIllumination, const in Surface surface, const in vec3 F0, const in float specularRoughness ) {
vec3 BRDF_Specular_GGX( const in Surface surface, vec3 lightDirection, const in vec3 F0, const in float specularRoughness ) {
float alpha = pow2( specularRoughness ); // UE4's roughness

vec3 halfDirection = normalize( directIllumination.lightDirection + surface.viewDirection );
vec3 halfDirection = normalize( lightDirection + surface.viewDirection );

float dotNL = saturate( dot( surface.normal, directIllumination.lightDirection ) );
float dotNL = saturate( dot( surface.normal, lightDirection ) );
float dotNV = saturate( dot( surface.normal, surface.viewDirection ) );
float dotNH = saturate( dot( surface.normal, halfDirection ) );
float dotLH = saturate( dot( directIllumination.lightDirection, halfDirection ) );
float dotLH = saturate( dot( lightDirection, halfDirection ) );

vec3 F = F_Schlick( F0, dotLH );
float G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );
float D = D_GGX( alpha, dotNH );

return directIllumination.color * dotNL * F * ( G * D );
return F * ( G * D );

} // validated

0 comments on commit c06ea81

Please sign in to comment.