1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
uniform float a2;
out vec4 FragColor;
void main() {
vec3 N, T, B, V;
float x = gl_FragCoord.x / BRDF_LUT_SIZE;
float y = gl_FragCoord.y / BRDF_LUT_SIZE;
/* There is little variation if ior > 1.0 so we
* maximize LUT precision for ior < 1.0 */
x = x * 1.1;
float ior = (x > 1.0) ? ior_from_f0((x-1.0) * 10.0) : sqrt(x);
float NV = (1.0 - (clamp(y, 1e-4, 0.9999)));
N = vec3(0.0, 0.0, 1.0);
T = vec3(1.0, 0.0, 0.0);
B = vec3(0.0, 1.0, 0.0);
V = vec3(sqrt(1.0 - NV * NV), 0.0, NV);
setup_noise();
/* Integrating BTDF */
float btdf_accum = 0.0;
for (float i = 0.0; i < sampleCount; i++) {
vec3 H = sample_ggx(i, a2, N, T, B); /* Microfacet normal */
float VH = dot(V, H);
/* Check if there is total internal reflections. */
float c = abs(VH);
float g = ior * ior - 1.0 + c * c;
float eta = 1.0/ior;
if (dot(H, V) < 0.0) {
H = -H;
eta = ior;
}
vec3 L = refract(-V, H, eta);
float NL = -dot(N, L);
if ((NL > 0.0) && (g > 0.0)) {
float LH = dot(L, H);
float G1_l = NL * 2.0 / G1_Smith_GGX(NL, a2); /* Balancing the adjustments made in G1_Smith */
/* btdf = abs(VH*LH) * (ior*ior) * D * G(V) * G(L) / (Ht2 * NV)
* pdf = (VH * abs(LH)) * (ior*ior) * D * G(V) / (Ht2 * NV) */
float btdf = G1_l * abs(VH*LH) / (VH * abs(LH));
btdf_accum += btdf;
}
}
btdf_accum /= sampleCount;
FragColor = vec4(btdf_accum, 0.0, 0.0, 1.0);
}
|