1 // This is the Schlick Term function, to be included into the shader classes
2
3 // Schlick approximation of Cook Torrance illumination model
4 float SchlickTerm(float t, float u, float v, float x, float w)
5 {
6 float s1, s2, // spectral factors
7 d1, d2, // directional factors
8 a1, a2, // azimuth angle
9 z1, z2, // zenith angle
10 zd1, zd2, // denominator of zenith angle (precomp)
11 gv1, gv2, // smith factor v
12 gx1, gx2; // smith factor v'
13
14 if (material->c1 == UNDEF)
15 return 0.0f;
16
17 // Single layered part
18 s1 = material->c1 + (1 - material->c1) * powf(1 - u, 5);
19
20 if (material->p1)
21 {
22 a1 = sqrt(material->p1 / (p12 - p12 * w + w));
23
24 if (material->r1)
25 {
26 zd1 = 1 + (material->r1 - 1) * t * t;
27 zd1 = zd1 * zd1;
28 z1 = material->r1 / zd1;
29 gv1 = v / (material->r1 - material->r1 * v + v);
30 gx1 = x / (material->r1 - material->r1 * x + x);
31 d1 = (((1 - gv1 * gx1) * v * x) + gv1 * gx1 * z1 / 4) * a1 / M_PI;
32 }
33 else
34 d1 = a1 / M_PI;
35 }
36 else
37 d1 = 0;
38
39 float result = s1 * d1;
40
41 // Optional double layered part
42 if (material->c2 != UNDEF)
43 {
44 s2 = material->c2 + (1 - material->c2) * powf(1 - u, 5);
45
46 if (material->p2)
47 {
48 a2 = sqrt(material->p2 / (p22 - p22 * w + w));
49
50 if (material->r2)
51 {
52 zd2 = 1 + (material->r2 - 1) * t * t;
53 zd2 = zd2 * zd2;
54 z2 = material->r2 / zd2;
55 gv2 = v / (material->r2 - material->r2 * v + v);
56 gx2 = x / (material->r2 - material->r2 * x + x);
57 d2 = (((1 - gv2 * gx2) * v * x) + gv2 * gx2 * z2 / 4) * a2 / M_PI;
58 }
59 else
60 d2 = a2 / M_PI;
61 }
62 else
63 d2 = 0;
64
65 result += (1 - s1) * s2 * d2;
66 }
67
68 return result;
69 }
syntax highlighted by Code2HTML, v. 0.9.1