Skip to content

Commit

Permalink
Restore lighting models
Browse files Browse the repository at this point in the history
  • Loading branch information
tobspr committed Nov 6, 2015
1 parent 3654ccd commit 2b3c4a4
Showing 1 changed file with 82 additions and 0 deletions.
82 changes: 82 additions & 0 deletions Shader/Includes/LightingModels.include
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#pragma once

// GGX
float DistributionBRDF(float roughness, float NxH)
{

// float m = roughness * roughness;
// float m2 = m * m;
// float d = ( NxH * m2 - NxH ) * NxH + 1;
// return m2 / ( d*d );

float m = roughness * roughness;
float m2 = m * m;
float NoH2 = NxH * NxH;
return exp( (NoH2 - 1) / (m2 * NoH2) ) / ( M_PI * m2 * NoH2 * NoH2 );

// float m = roughness * roughness;
// float m2 = m * m;
// float n = 2 / m2 - 2;
// return (n+2) / (2*M_PI) * pow( NxH, n ); // 1 mad, 1 exp, 1 mul, 1 log

}

// Schlick
float GeometricBRDF(float roughness, float NxV, float NxL)
{
// Fixed-value:
// return 0.25;

float a = roughness * roughness;
float a2 = a * a;

float v = NxV + sqrt( NxV * (NxV - NxV * a2) + a2 );
float l = NxL + sqrt( NxL * (NxL - NxL * a2) + a2 );
return saturate(1.0 / ( v * l ));

// float a = roughness * roughness;
// float Vis_SmithV = NxL * ( NxV * ( 1 - a ) + a );
// float Vis_SmithL = NxV * ( NxL * ( 1 - a ) + a );
// return 0.5 / ( Vis_SmithV + Vis_SmithL );
}

// Schlick
vec3 FresnelBRDF(vec3 specularColor, float LxH)
{
return specularColor + (1.0 - specularColor) * pow(1.0 - LxH, 5.0);
}


vec3 DiffuseBRDF(vec3 diffuseColor, float roughness, float NxV, float NxL, float VxH) {
float VxL = 2 * VxH - 1;
float m = roughness * roughness;
float m2 = m * m;
float C1 = 1 - 0.5 * m2 / (m2 + 0.33);
float Cosri = VxL - NxV * NxL;
float C2 = 0.45 * m2 / (m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NxL / NxV ) : NxL );
return diffuseColor / M_PI * ( NxL * C1 + C2 );
}

float safeDot(vec3 a, vec3 b) {
return max(0.0, dot(a, b));
}


float Vis_Smith( float Roughness, float NoV, float NoL )
{
float a = Roughness * Roughness;
float a2 = a*a;

float Vis_SmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 );
float Vis_SmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 );
return 1.0 / ( Vis_SmithV * Vis_SmithL );
}



vec3 computeSpecular(vec3 specularColor, float roughness, float NxL, float LxH, float NxV, float NxH) {
float specularD = DistributionBRDF(roughness, NxH);
float specularG = GeometricBRDF(roughness, NxV, NxL);
vec3 specularF = FresnelBRDF(specularColor, LxH);
return (specularD * specularG) * specularF;
}

0 comments on commit 2b3c4a4

Please sign in to comment.