-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathshaders.txt
74 lines (58 loc) · 2.41 KB
/
shaders.txt
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
struct FlatShader : public IShader {
mat<3,3,float> varying_tri;
virtual ~FlatShader() {}
virtual Vec3i vertex(int iface, int nthvert) {
Vec4f gl_Vertex = embed<4>(model->vert(iface, nthvert));
gl_Vertex = Projection*ModelView*gl_Vertex;
varying_tri.set_col(nthvert, proj<3>(gl_Vertex/gl_Vertex[3]));
gl_Vertex = Viewport*gl_Vertex;
return proj<3>(gl_Vertex/gl_Vertex[3]);
}
virtual bool fragment(Vec3f bar, TGAColor &color) {
Vec3f n = cross(varying_tri.col(1)-varying_tri.col(0),varying_tri.col(2)-varying_tri.col(0)).normalize();
float intensity = CLAMP(n*light_dir, 0.f, 1.f);
color = TGAColor(255, 255, 255)*intensity;
return false;
}
};
struct GouraudShader : public IShader {
mat<3,3,float> varying_tri;
Vec3f varying_ity;
virtual ~GouraudShader() {}
virtual Vec3i vertex(int iface, int nthvert) {
Vec4f gl_Vertex = embed<4>(model->vert(iface, nthvert));
gl_Vertex = Projection*ModelView*gl_Vertex;
varying_tri.set_col(nthvert, proj<3>(gl_Vertex/gl_Vertex[3]));
varying_ity[nthvert] = CLAMP(model->normal(iface, nthvert)*light_dir, 0.f, 1.f);
gl_Vertex = Viewport*gl_Vertex;
return proj<3>(gl_Vertex/gl_Vertex[3]);
}
virtual bool fragment(Vec3f bar, TGAColor &color) {
float intensity = varying_ity*bar;
color = TGAColor(255, 255, 255)*intensity;
return false;
}
};
struct ToonShader : public IShader {
mat<3,3,float> varying_tri;
Vec3f varying_ity;
virtual ~ToonShader() {}
virtual Vec3i vertex(int iface, int nthvert) {
Vec4f gl_Vertex = embed<4>(model->vert(iface, nthvert));
gl_Vertex = Projection*ModelView*gl_Vertex;
varying_tri.set_col(nthvert, proj<3>(gl_Vertex/gl_Vertex[3]));
varying_ity[nthvert] = CLAMP(model->normal(iface, nthvert)*light_dir, 0.f, 1.f);
gl_Vertex = Viewport*gl_Vertex;
return proj<3>(gl_Vertex/gl_Vertex[3]);
}
virtual bool fragment(Vec3f bar, TGAColor &color) {
float intensity = varying_ity*bar;
if (intensity>.85) intensity = 1;
else if (intensity>.60) intensity = .80;
else if (intensity>.45) intensity = .60;
else if (intensity>.30) intensity = .45;
else if (intensity>.15) intensity = .30;
color = TGAColor(255, 155, 0)*intensity;
return false;
}
};