UNPKG

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
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;