The Code Therapy

my shader

this is a shader that i am make

Created by purplejragon on Tue, 11 Oct 2022 13:45:37 GMT.


#version 300 es
precision highp float;

uniform vec2 resolution;
uniform float time;
out vec4 fragColor;
float rand(vec2 co){
  return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);
}
float noise(vec2 p) {
  vec2 i = floor(p);
  vec2 f = fract(p);
  f = smoothstep(0.0, 1.0, f);

  float bl = rand(i);
  float br = rand(i + vec2(1, 0));
  float tl = rand(i + vec2(0, 1));
  float tr = rand(i + vec2(1, 1));

  float b = mix(bl, br, f.x);
  float t = mix(tl, tr, f.x);
  return mix(b, t, f.y);
}

float map(vec3 p) {
  return length(p) - 0.5;
}
vec3 calcNormal(vec3 p)
{
  float eps = 0.001;
  vec2 h = vec2(eps,0);
  return normalize(vec3(map(p+h.xyy) - map(p-h.xyy),
                        map(p+h.yxy) - map(p-h.yxy),
                        map(p+h.yyx) - map(p-h.yyx)));
}
float raymarch(vec3 ro, vec3 rd) {
  float t = 0.0;
  vec3 p;

  for (int i = 0; i < 100; i++) {
    p = ro + rd * t;
    float dist = map(p);
    t += dist;
    if (t > 1000.0) return -1.0;
    if (dist < 0.001) return t;
  }
  return t;
}

void main(void) {
  vec2 position = (gl_FragCoord.xy - 0.5 * resolution) / resolution.y;
  vec3 color = vec3(0.0);
  vec3 ro = vec3(0, 0, 3);
  vec3 rd = normalize(vec3(position, -1.0));
  float t = raymarch(ro, rd);
  if (t > 0.0) {
    color = vec3(1.0);
    vec3 p = ro + rd * t;
    vec3 n = calcNormal(p);
    color = n * 0.5 + 0.5;
  }
  color = vec3(noise(gl_FragCoord.xy / 60.0));
  fragColor = vec4(sqrt(color), 1.0 );
}