mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-26 09:21:30 +11:00
103 lines
2.6 KiB
Plaintext
103 lines
2.6 KiB
Plaintext
#version 450
|
|
layout(std140, set = 0, binding = 0) uniform UBO
|
|
{
|
|
mat4 MVP;
|
|
vec4 OutputSize;
|
|
vec4 OriginalSize;
|
|
vec4 SourceSize;
|
|
uint FrameCount;
|
|
} global;
|
|
|
|
#pragma stage vertex
|
|
layout(location = 0) in vec4 Position;
|
|
layout(location = 1) in vec2 TexCoord;
|
|
layout(location = 0) out vec2 vTexCoord;
|
|
const vec2 madd = vec2(0.5, 0.5);
|
|
void main()
|
|
{
|
|
gl_Position = global.MVP * Position;
|
|
vTexCoord = gl_Position.xy;
|
|
}
|
|
|
|
#pragma stage fragment
|
|
layout(location = 0) in vec2 vTexCoord;
|
|
layout(location = 0) out vec4 FragColor;
|
|
|
|
float time = float(global.FrameCount)*0.0325;
|
|
vec2 resolution = global.OutputSize.xy;
|
|
float fade = 0.45;
|
|
|
|
const float PI=3.14159265358979323846;
|
|
|
|
float speed=time*0.25;
|
|
float ground_x=0.125-0.25*cos(PI*speed*0.25);
|
|
float ground_y=0.125+0.25*sin(PI*speed*0.25);
|
|
float ground_z=speed*0.125;
|
|
|
|
vec2 rotate(vec2 k,float t)
|
|
{
|
|
return vec2(cos(t)*k.x-sin(t)*k.y,sin(t)*k.x+cos(t)*k.y);
|
|
}
|
|
|
|
|
|
float scene(vec3 p)
|
|
{
|
|
float ball_p=0.25;
|
|
float ball_w=ball_p*1.0;
|
|
float ball=length(mod(p.xyz,ball_p)-ball_p*0.5)-ball_w;
|
|
float hole_w=ball_p*0.55;
|
|
float hole=length(mod(p.xyz,ball_p)-ball_p*0.5)-hole_w;
|
|
float pipe_p=0.015;
|
|
float pipe_w=pipe_p*0.42;//-0.00375*sync;
|
|
float pipe_y=length(max(abs(mod(p.xy,pipe_p)-pipe_p*0.5)-pipe_w,0.0));
|
|
float pipe_z=length(max(abs(mod(p.xz,pipe_p)-pipe_p*0.5)-pipe_w,0.0));
|
|
return max(max(ball,-hole),max(pipe_y,max(pipe_y,pipe_z)));
|
|
}
|
|
|
|
vec3 getNormal(vec3 pos)
|
|
{ vec3 e = vec3(0.0,0.0001,0.0);
|
|
return normalize(vec3( scene(pos+e.yxx)-scene(pos-e.yxx),scene(pos+e.xyx)-scene(pos-e.xyx),scene(pos+e.xxy)-scene(pos-e.xxy) ) );
|
|
}
|
|
float render_scene(vec3 ray_origin, vec3 ray_dir,float t)
|
|
{
|
|
const int ray_n=96;
|
|
for(int i=0;i<ray_n;i++)
|
|
{
|
|
|
|
float k=scene(ray_origin+ray_dir*t);
|
|
t+=k*fade;
|
|
}
|
|
return t;
|
|
}
|
|
|
|
|
|
void main(void)
|
|
{
|
|
vec2 FragCoord = vTexCoord.xy*global.OutputSize.xy;
|
|
FragCoord.y = -FragCoord.y;
|
|
|
|
vec2 position=(FragCoord.xy/resolution.xy);
|
|
vec2 p=-1.0+2.0*position;
|
|
//set up camera
|
|
float speed=time*0.5;
|
|
vec3 dir=normalize(vec3(p*vec2(1.0,1.0),1.));
|
|
dir.yz=rotate(dir.yz,PI*1.0*sin(speed*0.25)); // rotation x
|
|
dir.zx=rotate(dir.zx,PI*1.0*cos(speed*0.25)); // rotation y
|
|
dir.xy=rotate(dir.xy,-speed*0.5); // rotation z
|
|
vec3 ray=vec3(ground_x,ground_y,ground_z);
|
|
//the raymarch
|
|
float t=0.0;
|
|
t=render_scene(ray,dir,t);
|
|
vec3 hit=ray+dir*t;
|
|
t+=hit.x;
|
|
//get normal for reflection
|
|
vec3 n=getNormal(hit);
|
|
//render reflection
|
|
dir = reflect(dir,n);
|
|
dir = normalize(refract(dir,n,.82));
|
|
t=render_scene(ray,dir,t);
|
|
float c=(n.x*1.0+n.y+n.z)*0.5;
|
|
vec3 color=vec3(0.,c*t*0.125*p.x+t*0.1,c*t*0.);
|
|
color *= 2.412;
|
|
FragColor=vec4(color,1.0);
|
|
} |