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