/
test.osl
116 lines (107 loc) · 4.28 KB
/
test.osl
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "../common/shaders/pretty.h"
shader
test ()
{
{
float x = 3;
float y = 4;
float z = 5;
printf (" hypot (%g, %g) = %g\n", x, y, hypot(x,y));
printf (" hypot (%g, %g, %g) = %g\n", x, y, z, hypot(x,y,z));
vector vI = vector(1,-2,0);
vI = normalize(vI);
vector vN = vector(0, 1, 0);
printf (" reflect (%g, %g) = %g\n", vI, vN, reflect (vI, vN));
vN = vector(-1, 0, 0);
printf (" reflect (%g, %g) = %g\n", vI, vN, reflect (vI, vN));
// test total internal reflection (going from greater to lesser IOR)
printf (" testing total-internal reflection:\n");
float n1 = 1.42;
float n2 = 1.0;
float eta = n1/n2; // critical angle < 45 degrees
vI = vector(1,-1,0);
vI = normalize(vI);
vN = vector(0,1,0);
printf (" refract (%g, %g, %g) = %g\n", vI, vN, eta, refract (vI, vN, eta));
float Kr, Kt;
vector fR, fT;
fresnel(vI, vN, eta, Kr, Kt, fR, fT);
printf (" frensel: Kr= %g Kt = %g R = %g T = %g\n", Kr, Kt,
pretty(fR), pretty(fT));
// test regular refraction
printf (" testing regular refraction:\n");
n1 = 1.0;
n2 = 1.16;
eta = n1/n2;
vN = vector(1,2,3);
vN = normalize(vN);
vI = vector(-2,-1,-4);
vI = normalize(vI);
vector rR = refract(vI, vN, eta);
printf (" refract (%g, %g, %g) = %g\n", vI, vN, eta, rR);
float cos_incid_angle = dot(vI,vN);
float cos_refr_angle = dot(rR, -vN);
float sin1 = sqrt(1.0 - cos_incid_angle*cos_incid_angle);
float sin2 = sqrt(1.0 - cos_refr_angle*cos_refr_angle);
// n1/n2 = sin(theta2)/sin(theta1);
printf(" --> verify refract(): %g/%g = sin(%g)/sin(%g) => %g ?= %g\n",
n1,n2,degrees(asin(sin2)),degrees(asin(sin1)),
n1/n2, sin2/sin1);
fresnel(vI, vN, eta, Kr, Kt, fR, fT);
printf (" fresnel: Kr= %g Kt = %g R = %g T = %g\n", Kr, Kt,
pretty(fR), pretty(fT));
cos_incid_angle = dot(vI,vN);
cos_refr_angle = dot(fT, -vN);
sin1 = sqrt(1.0 - cos_incid_angle*cos_incid_angle);
sin2 = sqrt(1.0 - cos_refr_angle*cos_refr_angle);
// n1/n2 = sin(theta2)/sin(theta1);
printf(" --> verify fresnel(): %g/%g = sin(%g)/sin(%g) => %g ?= %g\n",
n1, n2, degrees(asin(sin2)), degrees(asin(sin1)), n1/n2, sin2/sin1);
}
{
}
printf (" Varying:\n");
{
float x = u;
float y = v;
float z = u+v;
printf (" hypot (%g, %g) = %g\n", x, y, hypot(x,y));
printf (" hypot (%g, %g, %g) = %g\n", x, y, z, hypot(x,y,z));
vector vI = vector(u,-2,0);
vI = normalize(vI);
vector vN = vector(v, 1, 0);
vN = normalize(vN);
printf (" reflect (%g, %g) = %g\n", vI, vN, reflect (vI, vN));
float n1 = 1.0;
float n2 = 1.33;
float eta = n1/n2;
vI = vector(u+0.5, v-0.5, -1.0);
vN = vector(0,0,1);
vI = normalize(vI);
vector rR = refract(vI, vN, eta);
printf (" refract (%g, %g, %g) = %g\n", vI, vN, eta, rR);
float cos_incid_angle = dot(vI,vN);
float cos_refr_angle = dot(rR, -vN);
float sin1 = sqrt(1.0 - cos_incid_angle*cos_incid_angle);
float sin2 = sqrt(1.0 - cos_refr_angle*cos_refr_angle);
// n1/n2 = sin(theta2)/sin(theta1);
printf(" --> verify refract(): %g/%g = sin(%g)/sin(%g) => %g ?= %g\n",
n1,n2,degrees(asin(sin2)),degrees(asin(sin1)),
n1/n2, sin2/sin1);
float Kr, Kt;
vector fR, fT;
fresnel(vI, vN, eta, Kr, Kt, fT, fT);
printf (" fresnel() -> Kr= %g Kt = %g R = %g T = %g\n", Kr, Kt,
pretty(fR), pretty(fT));
cos_incid_angle = dot(vI,vN);
cos_refr_angle = dot(fT, -vN);
sin1 = sqrt(1.0 - cos_incid_angle*cos_incid_angle);
sin2 = sqrt(1.0 - cos_refr_angle*cos_refr_angle);
// n1/n2 = sin(theta2)/sin(theta1);
printf(" --> verify fresnel(): %g/%g = sin(%g)/sin(%g) => %g ?= %g\n",
n1,n2,degrees(asin(sin2)),degrees(asin(sin1)),
n1/n2, sin2/sin1);
}
{
}
}