Files
Bliss-Shader/shaders/lib/lightning_stuff.glsl

49 lines
1.6 KiB
GLSL

uniform vec3 lightningEffect;
#ifdef IS_IRIS
uniform vec4 lightningBoltPosition;
#else
vec4 lightningBoltPosition = vec4(0.0, 100.0, 0.0, lightningEffect.x);
#endif
vec3 createLightningPointLight(
vec3 playerPos, vec3 lightningBoltPos
#if defined LIGHTNINGFLASH_DIFFUSE
, vec3 normal
#endif
#if defined LIGHTNINGFLASH_VL
,float cloudDensity
,float gradient
#endif
){
if(lightningBoltPosition.w > 0.0){
// make it only get 5x brighter than 1.0 as that is default emissive brightness.
vec3 flashColor = lightningEffect.rgb * 1.0;
// flashy flashy
flashColor *= (sin(lightningEffect.r*10.0)*0.5+0.5)*0.8+0.2;
vec3 boltPos = playerPos - lightningBoltPos;
// stretch the vertical component to cover the upper part of the bolt.
vec3 boltPos_stretched = playerPos - vec3(lightningBoltPos.x, clamp(playerPos.y, lightningBoltPos.y, lightningBoltPos.y+150.0), lightningBoltPos.z);
float flashDistance = length(boltPos_stretched);
#if defined LIGHTNINGFLASH_DIFFUSE
// lerp between 2 points for ndotl, for the lower and upper part of the bolt.
float NdotL = clamp(dot(normalize(boltPos - vec3(0,10,0)), -normal), 0, 1);
float NdotL2 = clamp(dot(normalize(boltPos - vec3(0,100,0)), -normal),0,1);
flashColor *= NdotL * (1.0 - NdotL2) + NdotL2;
flashColor *= exp(sqrt(flashDistance) * -0.5) * 15.0 * 3.0 * clamp(1.0-flashDistance/500.,0,1);
#endif
#if defined LIGHTNINGFLASH_VL
flashColor *= (1.0-exp(-3.0*cloudDensity)) * exp(-3.0*(1.0-gradient));
flashColor *= exp(sqrt(flashDistance) * -0.5) * 15.0 * clamp(1.0-flashDistance/500.,0,1);
#endif
return flashColor;
}else return vec3(0.0);
}