swwmgz_m/shaders/glsl/PlasmaBlast.fp

46 lines
1.6 KiB
GLSL

// basic texture + masked equirectangular envmap + gradient rim
// + dynamic glows (Plasma Blaster specific)
#define RECIPROCAL_PI2 0.15915494
#ifndef RIMSTEP
#define RIMSTEP .5
#endif
#ifndef ENVFACT
#define ENVFACT 1.
#endif
#ifndef RIMFACT
#define RIMFACT 1.
#endif
void SetupMaterial( inout Material mat )
{
vec4 base = getTexel(vTexCoord.st);
float mask = texture(masktex,vTexCoord.st).x;
vec3 norm = normalize(vWorldNormal.xyz);
vec3 eye = normalize(uCameraPos.xyz-pixelpos.xyz);
vec3 rvec = normalize(reflect(eye,norm));
vec2 uv = vec2(atan(rvec.z,rvec.x)*RECIPROCAL_PI2+.5,asin(rvec.y)*RECIPROCAL_PI2+.5);
vec2 uv2 = vec2(atan(rvec.z,abs(rvec.x))*RECIPROCAL_PI2+.5,asin(rvec.y)*RECIPROCAL_PI2+.5);
vec3 envcol = textureGrad(envtex,uv,dFdx(uv2),dFdy(uv2)).rgb*ENVFACT;
#ifdef RIM_LIGHTING
float rim = smoothstep(RIMSTEP,1.,1.-abs(dot(eye,norm)));
vec3 rimcol = texture(rimtex,vec2(.25+.5*rim,.5)).rgb;
envcol = mix(envcol,rimcol,rim*RIMFACT);
#endif
mat.Base = vec4(base.rgb+envcol*mask,base.a);
mat.Normal = ApplyNormalMap(vTexCoord.st);
if ( (uTextureMode&TEXF_Brightmap) != 0 )
mat.Bright = texture(brighttexture,vTexCoord.st);
// status canvas tex (only need two channels)
vec2 fade = texture(fadetex,vec2(.5)).rg;
// red: battery connection led
vec3 bat = texture(battex,vTexCoord.st).rgb*fade.r;
mat.Base.rgb += bat;
mat.Bright.rgb += vec3(max(bat.r,max(bat.g,bat.b)));
// green: charge glow
float chg = texture(chgtex,vTexCoord.st).x*fade.g;
// TODO noise
vec3 grad = texture(gradtex,vec2(.25+chg*.5,.5)).rgb;
mat.Base.rgb += grad;
mat.Bright.rgb += vec3(chg);
}