/
model.dei
157 lines (123 loc) · 5.98 KB
/
model.dei
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
model.skeletal {
# Shader for skeletal animation and generic per-pixel lighting:
# diffuse color, normal map, emissive map, specular intensity.
shader generic {
variable uAlpha { value = 1 }
variable uAlphaLimit { value = 0 }
variable uEmission { value = 0 }
# Mapping when used with ModelDrawable.
textureMapping <diffuse, normals, specular, emission>
include.vertex <include/tangentspace.glsl,
include/skeletal.glsl,
include/lighting.glsl>
vertex = "
uniform highp mat4 uMvpMatrix;
attribute highp vec4 aVertex;
attribute highp vec2 aUV;
attribute highp vec4 aBounds; // diffuse map
attribute highp vec4 aBounds2; // normal map
attribute highp vec4 aBounds3; // specular map
attribute highp vec4 aBounds4; // emission map
varying highp vec2 vUV;
varying highp vec4 vUVBounds[4];
void main(void)
{
highp mat4 bone = vertexBoneTransform();
highp mat3 surface = tangentSpace(bone);
calculateSurfaceLighting(surface);
// Vertex position.
highp vec4 modelPos = bone * aVertex;
gl_Position = uMvpMatrix * modelPos;
// Eye direction in tangent space.
calculateEyeDirection(modelPos, surface);
vUV = aUV;
vUVBounds[0] = aBounds;
vUVBounds[1] = aBounds2;
vUVBounds[2] = aBounds3;
vUVBounds[3] = aBounds4;
}"
include.fragment <include/texture.glsl,
include/lighting.glsl>
fragment = "
uniform highp float uAlpha;
uniform highp float uAlphaLimit; // alpha test to discard fragments
varying highp vec2 vUV;
varying highp vec4 vUVBounds[4];
void main(void)
{
// Calculate UV at the fragment (wrapped inside the bounds).
highp vec2 wrappedUV = fract(vUV);
highp vec2 uv = mapToBounds(wrappedUV, vUVBounds[0]);
highp vec2 normalUV = mapToBounds(wrappedUV, vUVBounds[1]);
highp vec2 specularUV = mapToBounds(wrappedUV, vUVBounds[2]);
highp vec2 emissiveUV = mapToBounds(wrappedUV, vUVBounds[3]);
highp vec3 normal = normalVector(normalUV);
highp vec4 diffuse = texture2D(uTex, uv);
diffuse.a *= uAlpha;
gl_FragColor = diffuse * diffuseLight(normal);
highp vec4 specular = specularLight(specularUV, normal);
gl_FragColor.rgb += specular.rgb;
gl_FragColor += emittedLight(emissiveUV);
// Specular reflections show up on transparent surfaces.
gl_FragColor.a = min(1.0, diffuse.a + specular.a);
if(gl_FragColor.a < uAlphaLimit) discard;
}"
}
# Shader for damage/blood effects. No emissive map, and alpha
# output is either opaque or fully transparent. Alpha limit can
# be used to control how much of the effect is visible.
shader blood {
variable uAlphaLimit { value = 0.5 }
# Mapping when used with ModelDrawable.
textureMapping <diffuse, normals, specular>
include.vertex <include/tangentspace.glsl,
include/skeletal.glsl,
include/lighting.glsl>
vertex = "
uniform highp mat4 uMvpMatrix;
attribute highp vec4 aVertex;
attribute highp vec2 aUV;
attribute highp vec4 aBounds; // diffuse map
attribute highp vec4 aBounds2; // normal map
attribute highp vec4 aBounds3; // specular map
varying highp vec2 vUV;
varying highp vec4 vUVBounds[3];
void main(void)
{
highp mat4 bone = vertexBoneTransform();
highp mat3 surface = tangentSpace(bone);
calculateSurfaceLighting(surface);
// Vertex position.
highp vec4 modelPos = bone * aVertex;
gl_Position = uMvpMatrix * modelPos;
// Eye direction in tangent space.
calculateEyeDirection(modelPos, surface);
vUV = aUV;
vUVBounds[0] = aBounds;
vUVBounds[1] = aBounds2;
vUVBounds[2] = aBounds3;
}"
include.fragment <include/texture.glsl,
include/lighting.glsl>
fragment = "
uniform highp float uAlphaLimit;
varying highp vec2 vUV;
varying highp vec4 vUVBounds[3];
void main(void)
{
// Calculate UV at the fragment (wrapped inside the bounds).
highp vec2 wrappedUV = fract(vUV);
highp vec2 uv = mapToBounds(wrappedUV, vUVBounds[0]);
highp vec2 normalUV = mapToBounds(wrappedUV, vUVBounds[1]);
highp vec2 specularUV = mapToBounds(wrappedUV, vUVBounds[2]);
highp vec4 diffuse = texture2D(uTex, uv);
if(diffuse.a < uAlphaLimit) discard;
highp vec3 normal = normalVector(normalUV);
gl_FragColor = diffuse * diffuseLight(normal);
highp vec4 specular = specularLight(specularUV, normal);
gl_FragColor.rgb += specular.rgb;
// All accepted fragments are opaque.
gl_FragColor.a = 1.0;
}"
}
}