83 lines
2.3 KiB
GLSL
83 lines
2.3 KiB
GLSL
#version 300 es
|
|
precision highp float;
|
|
uniform float u_main_shine;
|
|
uniform float u_other_shine;
|
|
uniform sampler2D u_texture;
|
|
uniform vec4 u_color;
|
|
uniform vec4 u_light_diffuse;
|
|
uniform vec4 u_light_specular;
|
|
uniform float u_shadow_black;
|
|
in float _type;
|
|
in float _flag;
|
|
in float _cmd;
|
|
in float _off;
|
|
in float _time;
|
|
in vec2 _tex;
|
|
in vec3 _nor;
|
|
in vec3 _v1;
|
|
in vec3 _v2;
|
|
in vec4 _back;
|
|
out vec4 color;
|
|
void main()
|
|
{
|
|
vec4 tex = texture(u_texture, _tex);
|
|
if (_flag == 0.0)
|
|
color = texture(u_texture, _tex);
|
|
else if (_flag < 10.0)
|
|
{
|
|
float d = _flag * 0.08;
|
|
color = vec4(vec3(0,0,0),(0.4-d)) * u_shadow_black;
|
|
}
|
|
else
|
|
{
|
|
float shine1A = 60.0 * u_main_shine;
|
|
float shine2A = 30.0 * u_main_shine;
|
|
float shine1B = 20.0 * u_other_shine;
|
|
float shine2B = 10.0 * u_other_shine;
|
|
vec3 v1 = _type == 1.0 ? vec3(0,-1.2,1) : _v1;
|
|
float k1 = max(dot(normalize(_nor),normalize(- v1)), 0.0);
|
|
float k2 = max(dot(normalize(_nor),normalize(-_v2)), 0.0);
|
|
float dif1 = min(max(k1*(_type==1.0?1.2:2.4), 0.40), 0.60);
|
|
float dif2 = min(max(k2*(_type==1.0?0.6:1.2), 0.40), 0.60);
|
|
float spc1 = min(pow(k1,_type==1.0?shine1A:shine1B)*(_type==1.0?10.0:0.5), _type==1.0?0.2:0.3);
|
|
float spc2 = min(pow(k2,_type==1.0?shine2A:shine2B)*(_type==1.0?15.0:0.5), _type==1.0?0.2:0.1);
|
|
float dif = min(dif1+dif2, _type==1.0?0.85:0.80);
|
|
float spc = min(spc1+spc2, _type==1.0?0.25:0.20);
|
|
if (_type == 1.0)
|
|
color = tex*u_light_diffuse*dif + vec4(1,1,1,1)*spc1 + _back*spc2;
|
|
else if (_type == 2.0)
|
|
{
|
|
if (_cmd == 0.0)
|
|
{
|
|
vec4 c = u_color.r+u_color.g+u_color.b > 0.01 ? u_color : tex;
|
|
color = c*dif + u_light_specular*spc;
|
|
}
|
|
else if (_time == 0.0)
|
|
{
|
|
if (_cmd == 1.0)
|
|
color = (tex*0.5+u_color*0.5)*dif + u_light_specular*spc;
|
|
else
|
|
color = tex*dif + u_light_specular*spc;
|
|
}
|
|
else
|
|
{
|
|
vec4 c;
|
|
float d = mod(abs(_cmd), 2.0);
|
|
vec4 tex_ = tex*0.5 + u_color*0.5;
|
|
float t = _cmd > 0.0 ? (d==1.0?_time:1.0-_time) : (d==1.0?1.0-_time:_time);
|
|
if (t > _off+0.2)
|
|
c = d==1.0 ? tex_ : tex;
|
|
else if (t > _off)
|
|
{
|
|
float k = d==1.0 ? 0.5-(_off+0.2-t)/0.4 : (_off+0.2-t)/0.4;
|
|
c = u_color*k + tex*(1.0-k);
|
|
}
|
|
else
|
|
c = d==1.0 ? tex : tex_;
|
|
color = c*dif + u_light_specular*spc;
|
|
}
|
|
}
|
|
color.a = 1.0;
|
|
}
|
|
}
|