mirror of
https://github.com/X0nk/Bliss-Shader.git
synced 2026-10-10 05:03:04 +08:00
49 lines
1.6 KiB
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);
|
|
} |