Skip to content

Commit 2b3c4a4

Browse files
committed
Restore lighting models
1 parent 3654ccd commit 2b3c4a4

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#pragma once
2+
3+
// GGX
4+
float DistributionBRDF(float roughness, float NxH)
5+
{
6+
7+
// float m = roughness * roughness;
8+
// float m2 = m * m;
9+
// float d = ( NxH * m2 - NxH ) * NxH + 1;
10+
// return m2 / ( d*d );
11+
12+
float m = roughness * roughness;
13+
float m2 = m * m;
14+
float NoH2 = NxH * NxH;
15+
return exp( (NoH2 - 1) / (m2 * NoH2) ) / ( M_PI * m2 * NoH2 * NoH2 );
16+
17+
// float m = roughness * roughness;
18+
// float m2 = m * m;
19+
// float n = 2 / m2 - 2;
20+
// return (n+2) / (2*M_PI) * pow( NxH, n ); // 1 mad, 1 exp, 1 mul, 1 log
21+
22+
}
23+
24+
// Schlick
25+
float GeometricBRDF(float roughness, float NxV, float NxL)
26+
{
27+
// Fixed-value:
28+
// return 0.25;
29+
30+
float a = roughness * roughness;
31+
float a2 = a * a;
32+
33+
float v = NxV + sqrt( NxV * (NxV - NxV * a2) + a2 );
34+
float l = NxL + sqrt( NxL * (NxL - NxL * a2) + a2 );
35+
return saturate(1.0 / ( v * l ));
36+
37+
// float a = roughness * roughness;
38+
// float Vis_SmithV = NxL * ( NxV * ( 1 - a ) + a );
39+
// float Vis_SmithL = NxV * ( NxL * ( 1 - a ) + a );
40+
// return 0.5 / ( Vis_SmithV + Vis_SmithL );
41+
}
42+
43+
// Schlick
44+
vec3 FresnelBRDF(vec3 specularColor, float LxH)
45+
{
46+
return specularColor + (1.0 - specularColor) * pow(1.0 - LxH, 5.0);
47+
}
48+
49+
50+
vec3 DiffuseBRDF(vec3 diffuseColor, float roughness, float NxV, float NxL, float VxH) {
51+
float VxL = 2 * VxH - 1;
52+
float m = roughness * roughness;
53+
float m2 = m * m;
54+
float C1 = 1 - 0.5 * m2 / (m2 + 0.33);
55+
float Cosri = VxL - NxV * NxL;
56+
float C2 = 0.45 * m2 / (m2 + 0.09) * Cosri * ( Cosri >= 0 ? min( 1, NxL / NxV ) : NxL );
57+
return diffuseColor / M_PI * ( NxL * C1 + C2 );
58+
}
59+
60+
float safeDot(vec3 a, vec3 b) {
61+
return max(0.0, dot(a, b));
62+
}
63+
64+
65+
float Vis_Smith( float Roughness, float NoV, float NoL )
66+
{
67+
float a = Roughness * Roughness;
68+
float a2 = a*a;
69+
70+
float Vis_SmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 );
71+
float Vis_SmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 );
72+
return 1.0 / ( Vis_SmithV * Vis_SmithL );
73+
}
74+
75+
76+
77+
vec3 computeSpecular(vec3 specularColor, float roughness, float NxL, float LxH, float NxV, float NxH) {
78+
float specularD = DistributionBRDF(roughness, NxH);
79+
float specularG = GeometricBRDF(roughness, NxV, NxL);
80+
vec3 specularF = FresnelBRDF(specularColor, LxH);
81+
return (specularD * specularG) * specularF;
82+
}

0 commit comments

Comments
 (0)