Merge pull request #4227 from rz5/master

(XMB VK snow) Attempt to fix the Vulkan snow menu shader
This commit is contained in:
Twinaphex 2016-12-12 05:15:51 +01:00 committed by GitHub
commit 52466e1fa2
2 changed files with 75 additions and 62 deletions

View File

@ -1,13 +1,77 @@
#version 310 es
layout(location = 0) in vec3 VertexCoord;
precision highp float;
layout(std140, set = 0, binding = 0) uniform UBO
{
vec4 OutputSize;
float time;
} constants;
} global;
layout(location = 0) in vec2 vTexCoord;
layout(location = 0) out vec4 FragColor;
float baseScale = 1.25; // [1.0 .. 10.0]
float density = 0.5; // [0.01 .. 1.0]
float speed = 0.15; // [0.1 .. 1.0]
float rand(vec2 co)
{
return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
}
float dist_func(vec2 distv)
{
float dist = sqrt((distv.x * distv.x) + (distv.y * distv.y)) * (40.0 / baseScale);
dist = clamp(dist, 0.0, 1.0);
return cos(dist * (3.14159265358 * 0.5)) * 0.5;
}
float random_dots(vec2 co)
{
float part = 1.0 / 20.0;
vec2 cd = floor(co / vec2(part));
float p = rand(cd);
if (p > 0.005 * (density * 40.0))
return 0.0;
vec2 dpos = (vec2(fract(p * 2.0) , p) + vec2(2.0, 2.0)) * 0.25;
vec2 cellpos = fract(co / part);
vec2 distv = (cellpos - dpos);
return dist_func(distv);
}
float snow(vec2 pos, float time, float scale)
{
// add wobble
pos.x += cos(pos.y * 1.2 + time * 3.14159 * 2.0 + 1.0 / scale) / (8.0 / scale) * 4.0;
// add gravity
pos += time * scale * vec2(-0.5, 1.0) * 4.0;
return random_dots(pos / vec2(scale)) * (scale * 0.5 + 0.5);
}
void main()
{
gl_Position = MVPMatrix * vec4(VertexCoord, 0.0, 1.0);
float tim = global.time * 0.4 * speed;
vec2 pos = vTexCoord.xy / global.OutputSize.xx;
float a = 0.0;
// Each of these is a layer of snow
// Remove some for better performance
// Changing the scale (3rd value) will mess with the looping
a += snow(pos, tim, 1.0);
a += snow(pos, tim, 0.7);
a += snow(pos, tim, 0.6);
a += snow(pos, tim, 0.5);
a += snow(pos, tim, 0.4);
a += snow(pos, tim, 0.3);
a += snow(pos, tim, 0.25);
a += snow(pos, tim, 0.125);
a = a * min(pos.y * 4.0, 1.0);
FragColor = vec4(1.0, 1.0, 1.0, a);
}

View File

@ -1,66 +1,15 @@
#version 310 es
precision highp float;
layout(location = 0) in vec4 Position;
layout(location = 1) in vec2 TexCoord;
layout(location = 0) out vec2 vTexCoord;
layout(std140, set = 0, binding = 0) uniform UBO
{
float time;
} constants;
layout(location = 0) out vec4 FragColor;
vec2 res = vec2(1920*3, 1080*3);
// High quality = larger patterns
// quality * 84 is the number of seconds in a loop
float quality = 8.0;
float Cellular2D(vec2 P) {
// https://github.com/BrianSharpe/Wombat/blob/master/Cellular2D.glsl
vec2 Pi = floor(P);
vec2 Pf = P - Pi;
vec2 Pt = vec2( Pi.x, Pi.y + 1.0 );
Pt = Pt - floor(Pt * ( 1.0 / 71.0 )) * 71.0;
Pt += vec2( 26.0, 161.0 ).xy;
Pt *= Pt;
Pt = Pt.xy * Pt.yx;
float hash_x = fract( Pt * ( 1.0 / 951.135664 ) ).x * 2.0 - 1.0;
float hash_y = fract( Pt * ( 1.0 / 642.949883 ) ).y * 2.0 - 1.0;
const float JITTER_WINDOW = 0.25;
hash_x = ( ( hash_x * hash_x * hash_x ) - sign( hash_x ) ) * JITTER_WINDOW;
hash_y = ( ( hash_y * hash_y * hash_y ) - sign( hash_y ) ) * JITTER_WINDOW;
vec2 dd = vec2(Pf.x - hash_x, Pf.y - hash_y);
float d = dd.x * dd.x + dd.y * dd.y;
return d * ( 1.0 / 1.125 );
}
float snow(vec2 pos, float time, float scale) {
// add wobble
pos.x += cos(pos.y*4.0 + time*3.14159*2.0 + 1.0/scale)/(8.0/scale);
// add gravity
pos += time*scale*vec2(-0.5, 1.0);
return max(
1.0 - Cellular2D(mod(pos/scale, scale*quality)*16.0)*1024.0,
0.0
) * (scale*0.5 + 0.5);
}
mat4 MVP;
} global;
void main()
{
float winscale = max(res.x, res.y);
float tim = mod(constants.time/800.0, 84.0*quality);
vec2 pos = gl_FragCoord.xy/winscale;
float a = 0.0;
// Each of these is a layer of snow
// Remove some for better performance
// Changing the scale (3rd value) will mess with the looping
a += snow(pos, tim, 1.0);
a += snow(pos, tim, 0.7);
a += snow(pos, tim, 0.6);
a += snow(pos, tim, 0.5);
a += snow(pos, tim, 0.4);
a += snow(pos, tim, 0.3);
a += snow(pos, tim, 0.25);
a += snow(pos, tim, 0.125);
a = a * min(pos.y*4.0, 1.0);
FragColor = vec4(1.0, 1.0, 1.0, a);
gl_Position = global.MVP * vec4(TexCoord, 0.0, 1.0);
vTexCoord = TexCoord;
}