Files
MoGoEagleEye/libraries/mapmodule/src/main/assets/shaders/fBaseNor.glsl
2023-08-07 11:21:55 +08:00

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