Skip to content

Commit

Permalink
feat: simplify DirectLight to radiance and direction. Use dotNL inste…
Browse files Browse the repository at this point in the history
…ad of normalFluxRatio.
  • Loading branch information
bhouston committed Jul 28, 2020
1 parent 2dc16f7 commit e623d6a
Show file tree
Hide file tree
Showing 16 changed files with 66 additions and 106 deletions.
18 changes: 7 additions & 11 deletions src/examples/brdfs/clearcoat/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ uniform sampler2D albedoMap;

uniform sampler2D clearCoatBumpMap;


#pragma include <brdfs/common>
#pragma include <lighting/punctual>
#pragma include <brdfs/ambient/basic>
Expand Down Expand Up @@ -47,18 +46,15 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float clearCoatNormalFluxRatio = saturate( dot( lightDirection, clearCoatSurface.normal ) );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float clearCoatDotNL = saturate( dot( directLight.direction, clearCoatSurface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * clearCoatNormalFluxRatio *
BRDF_Specular_GGX( clearCoatSurface, lightDirection, clearCoatF0, clearCoatRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * clearCoatDotNL *
BRDF_Specular_GGX( clearCoatSurface, directLight.direction, clearCoatF0, clearCoatRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
7 changes: 2 additions & 5 deletions src/examples/brdfs/lambert/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,10 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
15 changes: 6 additions & 9 deletions src/examples/brdfs/sheen/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,14 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Sheen_Charlie( surface, lightDirection, sheenColor, sheenIntensity, sheenRoughness ) ;
outgoingRadiance += (1. - sheenIntensity ) * lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Sheen_Charlie( surface, directLight.direction, sheenColor, sheenIntensity, sheenRoughness ) ;
outgoingRadiance += (1. - sheenIntensity ) * directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/brdfs/specular/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/brdfs/specularAnisotropic/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/lights/directional/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,12 @@ void main() {
DirectLight directLight;
directionalLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/lights/multi/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,11 @@ void main() {
directionalLightToDirectLight( surface, punctualLight, directLight );
}

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

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

outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

}
Expand Down
11 changes: 4 additions & 7 deletions src/examples/lights/point/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/lights/spot/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,12 @@ void main() {
DirectLight directLight;
spotLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
13 changes: 7 additions & 6 deletions src/examples/materials/outputChannels/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,17 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 irradiance = directLight.irradiance;
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outputDiffuse;
vec3 outputSpecular;
vec3 outputColor;
outputColor += outputChannels.specular = irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += outputChannels.diffuse = irradiance * BRDF_Diffuse_Lambert( albedo );
vec3 outputRadiance;
outputRadiance += outputChannels.specular = directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness );
outputRadiance += outputChannels.diffuse = directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

outputChannels.beauty = linearTosRGB( outputColor );
outputChannels.beauty = linearTosRGB( outputRadiance );

int newFragmentOutputs = int( mod(( -gl_FragCoord.x * 3. + gl_FragCoord.y ) * 0.002 + float( time ) / 3000., 13. ) );

Expand Down
11 changes: 4 additions & 7 deletions src/examples/microgeometry/bump/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/microgeometry/displacement/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/microgeometry/normals/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
11 changes: 4 additions & 7 deletions src/examples/microgeometry/normals2/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,12 @@ void main() {
DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

vec3 lightDirection = directLight.lightDirection;
vec3 lightRadiance = directLight.radiance;

float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );
float dotNL = saturate( dot( directLight.direction, surface.normal ) );

vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Specular_GGX( surface, directLight.direction, specularF0, specularRoughness ) ;
outgoingRadiance += directLight.radiance * dotNL *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
Expand Down
3 changes: 1 addition & 2 deletions src/lib/shaders/includes/brdfs/common.glsl
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
#pragma once

// Q: should this be radiance? Then we can change its interaction based on the different surface normals?
struct DirectLight {
vec3 radiance; // in standard BRDF notation: L[i](w[i])
vec3 lightDirection; // in standard BRDF notation: w[i]
vec3 direction; // in standard BRDF notation: w[i]
};

struct Surface {
Expand Down
6 changes: 3 additions & 3 deletions src/lib/shaders/includes/lighting/punctual.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void pointLightToDirectLight( in Surface surface, in PunctualLight punctualLight
float lightAttenuation = getRangeAttenuation( length( surfaceToLight ), punctualLight.range );
vec3 lightDirection = normalize( surfaceToLight );

directLight.lightDirection = lightDirection;
directLight.direction = lightDirection;
directLight.radiance = punctualLight.intensity * lightAttenuation;
}

Expand All @@ -66,12 +66,12 @@ void spotLightToDirectLight( in Surface surface, in PunctualLight punctualLight,
float lightAttenuation = getRangeAttenuation( length( surfaceToLight ), punctualLight.range );
lightAttenuation *= getSpotAttenuation( lightDirection, punctualLight );

directLight.lightDirection = lightDirection;
directLight.direction = lightDirection;
directLight.radiance = punctualLight.intensity * lightAttenuation;
}

void directionalLightToDirectLight( in Surface surface, in PunctualLight punctualLight, out DirectLight directLight ) {

directLight.lightDirection = -punctualLight.direction;
directLight.direction = -punctualLight.direction;
directLight.radiance = punctualLight.intensity;
}

0 comments on commit e623d6a

Please sign in to comment.