From 811cd3221b4d95b3aa225a4893c4480eb94bb988 Mon Sep 17 00:00:00 2001 From: DarkGod <darkgod@net-core.org> Date: Fri, 23 May 2014 10:56:39 +0200 Subject: [PATCH] improve starfall --- .../tome/data/gfx/shaders/starfall.frag | 115 ++---------------- 1 file changed, 10 insertions(+), 105 deletions(-) diff --git a/game/modules/tome/data/gfx/shaders/starfall.frag b/game/modules/tome/data/gfx/shaders/starfall.frag index 6ff10dc3bd..6d46520b3c 100644 --- a/game/modules/tome/data/gfx/shaders/starfall.frag +++ b/game/modules/tome/data/gfx/shaders/starfall.frag @@ -5,8 +5,6 @@ uniform float time_factor; float antialiasingRadius = 0.99; //1.0 is no antialiasing, 0.0 - fully smoothed(looks worse) -float snoise( vec3 v ); - vec4 Uberblend(vec4 col0, vec4 col1) { // return vec4((1.0 - col0.a) * (col1.rgb) + col0.a * (col1.rgb * col1.a + col0.rgb * (1.0 - col1.a)), min(1.0, col0.a + col1.a)); @@ -22,15 +20,14 @@ vec4 Uberblend(vec4 col0, vec4 col1) void main(void) { vec2 radius = vec2(0.5, 0.5) - gl_TexCoord[0].xy; - float shieldIntensity = 0.1; //physically affects shield layer thickness //radius.x *= ellispoidalFactor; //for simple ellipsoid //comment next line for regular spherical shield //radius.x *= (1.0 + ellipsoidalFactor) * 0.5 + (ellipsoidalFactor - 1.0) * 0.5 * pow(cos(tick / time_factor * oscillationSpeed), 2.0); //on-hit wobbling effect - float coreTime = 0.3; - float outerSphereTime = 0.42; - float debrisStartTime = 0.38; + float coreTime = 0.4; + float outerSphereTime = 0.55 + 0.1; + float debrisStartTime = 0.52; /*float coreTime = 0.1; float outerSphereTime = 0.9;*/ @@ -43,6 +40,7 @@ void main(void) vec4 sphereColor = vec4(0.0, 0.0, 0.0, 0.0); float phase = clamp((tick - tick_start) / time_factor, 0.0, 1.0); + //float phase = mod((tick - tick_start) / time_factor, 1.0); float innerSpherePhase = clamp(phase / coreTime, 0.0, 1.0); vec3 color = clamp(gl_Color.rgb * (1.0 + pow(innerSpherePhase, 2.0) * 10.0), 0.0, 1.0); @@ -72,15 +70,15 @@ void main(void) texCoord.y = mod(texCoord.y, 0.995) * 0.5; vec4 fractureColor = texture2D(tex, texCoord); float phaseSubstraction = (1.0 - fracturePhase) * 0.5; - float fractureShininess = 0.2 + clamp((fractureColor.a - phaseSubstraction) / (1.0 - phaseSubstraction + 0.1), 0.0, 1.0) * (0.5 + fracturePhase * 40.0); + float fractureShininess = 0.02 + clamp((fractureColor.a - phaseSubstraction) / (1.0 - phaseSubstraction + 0.1), 0.0, 1.0) * (0.05 + fracturePhase * 4.0); - float resultShininess = fractureShininess * shieldIntensity / cos(alpha); + float resultShininess = fractureShininess / cos(alpha); sphereColor = blackColor + vec4(color * resultShininess, 0.0); sphereColor.a *= min(1.0, sphereColor.a) * antialiasingCoef; gl_FragColor = vec4(0.0, 0.0, texCoord.x, 1.0); } - float rayPhase = clamp(innerSpherePhase * 1.1, 0.0, 1.0); + float rayPhase = clamp(innerSpherePhase * 0.9 + 0.1, 0.0, 1.0); vec2 raysTexPos = (clamp(radius / (radiusScale + 1e-5) + vec2(0.5, 0.5), 0.01, 0.99)) * vec2(0.5, 0.5) + vec2(0.5, 0.0); vec4 raysTexColor = texture2D(tex, raysTexPos); float raysSubtraction = (1.0 - rayPhase) * 1.0; @@ -112,9 +110,8 @@ void main(void) texCoord.x = mod(texCoord.x, 0.995) * 0.5;// + 0.505; texCoord.y = mod(texCoord.y, 0.995) * 0.5;// + 0.505; - outerSphereColor = vec4(color, 1.0 - exp(-100.0 * texture2D(tex, texCoord).a * shieldIntensity / cos(alpha))); + outerSphereColor = vec4(color, 1.0 - exp(-55.0 * (pow(1.0 - outerSpherePhase, 3.0)) * texture2D(tex, texCoord).a / cos(alpha))); outerSphereColor.a *= antialiasingCoef; - outerSphereColor.a *= 1.0 - pow(outerSpherePhase, 5.0); } float coreTransperency = pow(1.0 - outerSpherePhase, 2.0); @@ -126,103 +123,11 @@ void main(void) vec2 debrisTexPos = (clamp(radius + vec2(0.5, 0.5), 0.01, 0.99)) * vec2(0.5, 0.5) + vec2(0.0, 0.5); vec4 debrisColor = texture2D(tex, debrisTexPos); debrisColor.rgb *= color; - float debrisIntensity = (1.0 - pow(debrisPhase, 2.0)) * 0.5; - float debrisSubtraction = debrisPhase; + float debrisIntensity = (1.0 - pow(debrisPhase, 1.0)) * 0.5 * (1.0 - pow(1.0 - debrisPhase, 12.0)); + float debrisSubtraction = pow(debrisPhase, 5.0); debrisColor.a = clamp((debrisColor.a - debrisSubtraction) / (1.0 - debrisSubtraction) * debrisIntensity * 5.0, 0.0, 1.0); explosionColor = Uberblend(debrisColor, explosionColor); } gl_FragColor = explosionColor; } - - -vec4 permute( vec4 x ) { - - return mod( ( ( x * 34.0 ) + 1.0 ) * x, 289.0 ); - -} - -vec4 taylorInvSqrt( vec4 r ) { - - return 1.79284291400159 - 0.85373472095314 * r; - -} - -float snoise( vec3 v ) { - - const vec2 C = vec2( 1.0 / 6.0, 1.0 / 3.0 ); - const vec4 D = vec4( 0.0, 0.5, 1.0, 2.0 ); - - // First corner - - vec3 i = floor( v + dot( v, C.yyy ) ); - vec3 x0 = v - i + dot( i, C.xxx ); - - // Other corners - - vec3 g = step( x0.yzx, x0.xyz ); - vec3 l = 1.0 - g; - vec3 i1 = min( g.xyz, l.zxy ); - vec3 i2 = max( g.xyz, l.zxy ); - - vec3 x1 = x0 - i1 + 1.0 * C.xxx; - vec3 x2 = x0 - i2 + 2.0 * C.xxx; - vec3 x3 = x0 - 1. + 3.0 * C.xxx; - - // Permutations - - i = mod( i, 289.0 ); - vec4 p = permute( permute( permute( - i.z + vec4( 0.0, i1.z, i2.z, 1.0 ) ) - + i.y + vec4( 0.0, i1.y, i2.y, 1.0 ) ) - + i.x + vec4( 0.0, i1.x, i2.x, 1.0 ) ); - - // Gradients - // ( N*N points uniformly over a square, mapped onto an octahedron.) - - float n_ = 1.0 / 7.0; // N=7 - - vec3 ns = n_ * D.wyz - D.xzx; - - vec4 j = p - 49.0 * floor( p * ns.z *ns.z ); // mod(p,N*N) - - vec4 x_ = floor( j * ns.z ); - vec4 y_ = floor( j - 7.0 * x_ ); // mod(j,N) - - vec4 x = x_ *ns.x + ns.yyyy; - vec4 y = y_ *ns.x + ns.yyyy; - vec4 h = 1.0 - abs( x ) - abs( y ); - - vec4 b0 = vec4( x.xy, y.xy ); - vec4 b1 = vec4( x.zw, y.zw ); - - - vec4 s0 = floor( b0 ) * 2.0 + 1.0; - vec4 s1 = floor( b1 ) * 2.0 + 1.0; - vec4 sh = -step( h, vec4( 0.0 ) ); - - vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; - vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww; - - vec3 p0 = vec3( a0.xy, h.x ); - vec3 p1 = vec3( a0.zw, h.y ); - vec3 p2 = vec3( a1.xy, h.z ); - vec3 p3 = vec3( a1.zw, h.w ); - - // Normalise gradients - - vec4 norm = taylorInvSqrt( vec4( dot( p0, p0 ), dot( p1, p1 ), dot( p2, p2 ), dot( p3, p3 ) ) ); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - - // Mix final noise value - - vec4 m = max( 0.6 - vec4( dot( x0, x0 ), dot( x1, x1 ), dot( x2, x2 ), dot( x3, x3 ) ), 0.0 ); - m = m * m; - return 42.0 * dot( m*m, vec4( dot( p0, x0 ), dot( p1, x1 ), - dot( p2, x2 ), dot( p3, x3 ) ) ); - -} - -- GitLab