Skip to content

Commit

Permalink
feat: refactor towards standard BRDF form (incoming irradiance to out…
Browse files Browse the repository at this point in the history
…put radiance)
  • Loading branch information
bhouston committed Jul 27, 2020
1 parent 8e9eaf3 commit 2dc16f7
Show file tree
Hide file tree
Showing 27 changed files with 165 additions and 109 deletions.
22 changes: 14 additions & 8 deletions src/examples/brdfs/clearcoat/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform sampler2D albedoMap;
Expand Down Expand Up @@ -41,21 +41,27 @@ void main() {

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.range = pointLightRange;

DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Specular_GGX( clearCoatSurface, lightDirection, clearCoatF0, clearCoatRoughness );
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float clearCoatNormalFluxRatio = saturate( dot( lightDirection, clearCoatSurface.normal ) );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
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 *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/brdfs/clearcoat/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(0.0, 0, 0.0),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightRange: 6.0,

// materials
Expand Down
15 changes: 9 additions & 6 deletions src/examples/brdfs/lambert/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform vec3 albedoModulator;
Expand All @@ -23,7 +23,7 @@ void main() {
PunctualLight punctualLight;
punctualLight.type = LightType_Point;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.direction = vec3(0.);
punctualLight.range = pointLightRange;
punctualLight.innerConeCos = 0.;
Expand All @@ -37,12 +37,15 @@ void main() {
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/brdfs/lambert/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(1, 0, -0.5),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(40.0),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(40.0),
pointLightRange: 6.0,

// materials
Expand Down
21 changes: 13 additions & 8 deletions src/examples/brdfs/sheen/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform vec3 sheenColor;
Expand Down Expand Up @@ -36,21 +36,26 @@ void main() {

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.range = pointLightRange;

DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Sheen_Charlie( surface, lightDirection, sheenColor, sheenIntensity, sheenRoughness );
outputColor += (1. - sheenIntensity ) * irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
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 *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/brdfs/sheen/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(0.0, 0, 0.0),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightRange: 6.0,

// materials
Expand Down
18 changes: 11 additions & 7 deletions src/examples/brdfs/specular/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform vec3 albedoModulator;
Expand Down Expand Up @@ -35,20 +35,24 @@ void main() {

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.range = pointLightRange;

DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/brdfs/specular/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(1, 0, -0.5),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(40.0),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(40.0),
pointLightRange: 6.0,

// materials
Expand Down
18 changes: 11 additions & 7 deletions src/examples/brdfs/specularAnisotropic/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform float specularAnisotropicScale;
Expand Down Expand Up @@ -36,7 +36,7 @@ void main() {

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.range = pointLightRange;

specularAnisotropicBentNormal( surface, length( specularAnisotropicFlow ), specularRoughness );
Expand All @@ -45,13 +45,17 @@ void main() {
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/brdfs/specularAnisotropic/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(0.0, 0, 0.0),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(0.7),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(0.7),
pointLightRange: 12.0,

// materials
Expand Down
16 changes: 10 additions & 6 deletions src/examples/lights/directional/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,23 @@ void main() {

PunctualLight punctualLight;
punctualLight.direction = directionalLightViewDirection;
punctualLight.color = directionalLightColor;
punctualLight.intensity = directionalLightColor;

DirectLight directLight;
directionalLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
16 changes: 10 additions & 6 deletions src/examples/lights/multi/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void main() {

uvToTangentFrame( surface, v_uv0 );

vec3 outputColor;
vec3 outgoingRadiance;

for( int i = 0; i < MAX_PUNCTUAL_LIGHTS; i ++ ) {

Expand All @@ -48,7 +48,7 @@ void main() {
punctualLight.type = punctualLightType[i];
punctualLight.position = punctualLightViewPosition[i];
punctualLight.direction = punctualLightViewDirection[i];
punctualLight.color = punctualLightColor[i];
punctualLight.intensity = punctualLightColor[i];
punctualLight.range = punctualLightRange[i];
punctualLight.innerConeCos = punctualLightInnerCos[i];
punctualLight.outerConeCos = punctualLightOuterCos[i];
Expand All @@ -65,14 +65,18 @@ void main() {
}

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

outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

}

gl_FragColor.rgb = linearTosRGB( outputColor );
gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
18 changes: 11 additions & 7 deletions src/examples/lights/point/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ varying vec3 v_viewSurfaceNormal;
varying vec2 v_uv0;

uniform vec3 pointLightViewPosition;
uniform vec3 pointLightColor;
uniform vec3 pointLightIntensity;
uniform float pointLightRange;

uniform vec2 normalModulator;
Expand Down Expand Up @@ -38,20 +38,24 @@ void main() {

PunctualLight punctualLight;
punctualLight.position = pointLightViewPosition;
punctualLight.color = pointLightColor;
punctualLight.intensity = pointLightIntensity;
punctualLight.range = pointLightRange;

DirectLight directLight;
pointLightToDirectLight( surface, punctualLight, directLight );

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

vec3 outputColor;
outputColor += irradiance * BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness );
outputColor += irradiance * BRDF_Diffuse_Lambert( albedo );
float normalFluxRatio = saturate( dot( lightDirection, surface.normal ) );

gl_FragColor.rgb = linearTosRGB( outputColor );
vec3 outgoingRadiance;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Specular_GGX( surface, lightDirection, specularF0, specularRoughness ) ;
outgoingRadiance += lightRadiance * normalFluxRatio *
BRDF_Diffuse_Lambert( albedo );

gl_FragColor.rgb = linearTosRGB( outgoingRadiance );
gl_FragColor.a = 1.;

}
2 changes: 1 addition & 1 deletion src/examples/lights/point/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ async function init(): Promise<null> {

// lights
pointLightViewPosition: new Vector3(0.0, 0, 0.0),
pointLightColor: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightIntensity: new Vector3(1, 1, 1).multiplyByScalar(30.0),
pointLightRange: 6.0,

// materials
Expand Down
Loading

0 comments on commit 2dc16f7

Please sign in to comment.