rms/resources/shaders/main.glsl
2020-07-07 06:40:50 +02:00

93 lines
1.7 KiB
GLSL

// ----- Vertex Shader -----
#version 330 core
layout(location = 0) in vec3 position;
uniform mat4 projection;
uniform mat4 model;
void main(){
gl_Position = projection * model * vec4(position,1);
}
// ----- Fragment Shader -----
#version 330 core
uniform vec2 resolution;
uniform float time;
out vec3 color;
#define MAX_STEPS 100
#define MAX_DIST 100.
#define SURF_DIST .01
float GetDist(vec3 p) {
vec4 s = vec4(0, 1, 6, 1);
float sphereDist = length(p-s.xyz)-s.w;
float planeDist = p.y;
float d = min(sphereDist, planeDist);
return d;
}
float RayMarch(vec3 ro, vec3 rd) {
float dO=0.;
for(int i=0; i<MAX_STEPS; i++) {
vec3 p = ro + rd*dO;
float dS = GetDist(p);
dO += dS;
if(dO>MAX_DIST || dS<SURF_DIST) break;
}
return dO;
}
vec3 GetNormal(vec3 p) {
float d = GetDist(p);
vec2 e = vec2(.01, 0);
vec3 n = d - vec3(
GetDist(p-e.xyy),
GetDist(p-e.yxy),
GetDist(p-e.yyx));
return normalize(n);
}
float GetLight(vec3 p) {
vec3 lightPos = vec3(0, 5, 6);
lightPos.xz += vec2(sin(time), cos(time))*2.;
vec3 l = normalize(lightPos-p);
vec3 n = GetNormal(p);
float dif = clamp(dot(n, l), 0., 1.);
float d = RayMarch(p+n*SURF_DIST*2., l);
if(d<length(lightPos-p)) dif *= .1;
return dif;
}
void main()
{
vec2 uv = (gl_FragCoord.xy-.5*resolution.xy)/resolution.y;
vec3 col = vec3(0);
vec3 ro = vec3(0, 1, 0);
vec3 rd = normalize(vec3(uv.x, uv.y, 1));
float d = RayMarch(ro, rd);
vec3 p = ro + rd * d;
float dif = GetLight(p);
col = vec3(dif);
col = pow(col, vec3(.4545)); // gamma correction
color = col;
}