mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
77 lines (62 loc) • 1.95 kB
text/typescript
const shader = `
precision mediump float;
uniform sampler2D u_tilesets[15];
varying vec4 v_tilesets;
varying vec2 v_uv[4];
varying vec3 v_normal;
const vec3 lightDirection = normalize(vec3(-0.3, -0.3, 0.25));
vec4 sample(float tileset, vec2 uv) {
// 1.0 - 1.0 == 0.0 is not always true.
int i = int(tileset - 0.6);
if (i == 0) {
return texture2D(u_tilesets[0], uv);
} else if (i == 1) {
return texture2D(u_tilesets[1], uv);
} else if (i == 2) {
return texture2D(u_tilesets[2], uv);
} else if (i == 3) {
return texture2D(u_tilesets[3], uv);
} else if (i == 4) {
return texture2D(u_tilesets[4], uv);
} else if (i == 5) {
return texture2D(u_tilesets[5], uv);
} else if (i == 6) {
return texture2D(u_tilesets[6], uv);
} else if (i == 7) {
return texture2D(u_tilesets[7], uv);
} else if (i == 8) {
return texture2D(u_tilesets[8], uv);
} else if (i == 9) {
return texture2D(u_tilesets[9], uv);
} else if (i == 10) {
return texture2D(u_tilesets[10], uv);
} else if (i == 11) {
return texture2D(u_tilesets[11], uv);
} else if (i == 12) {
return texture2D(u_tilesets[12], uv);
} else if (i == 13) {
return texture2D(u_tilesets[13], uv);
} else if (i == 14) {
return texture2D(u_tilesets[14], uv);
}
}
vec4 blend(vec4 color, float tileset, vec2 uv) {
vec4 texel = sample(tileset, uv);
return mix(color, texel, texel.a);
}
void main() {
vec4 color = sample(v_tilesets[0], v_uv[0]);
if (v_tilesets[1] > 0.5) {
color = blend(color, v_tilesets[1], v_uv[1]);
}
if (v_tilesets[2] > 0.5) {
color = blend(color, v_tilesets[2], v_uv[2]);
}
if (v_tilesets[3] > 0.5) {
color = blend(color, v_tilesets[3], v_uv[3]);
}
//color *= clamp(dot(v_normal, lightDirection) + 0.45, 0.0, 1.0);
gl_FragColor = vec4(color.rgb, 1.0);
}
`;
export default shader;