aboutsummaryrefslogtreecommitdiff
path: root/resources/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'resources/shaders')
-rw-r--r--resources/shaders/algorithms/ray_marching.glsl5
-rw-r--r--resources/shaders/main.glsl77
-rw-r--r--resources/shaders/objects/sphere.glsl4
3 files changed, 81 insertions, 5 deletions
diff --git a/resources/shaders/algorithms/ray_marching.glsl b/resources/shaders/algorithms/ray_marching.glsl
new file mode 100644
index 0000000..d984c0e
--- /dev/null
+++ b/resources/shaders/algorithms/ray_marching.glsl
@@ -0,0 +1,5 @@
+
+
+RayMarching(vec3 ro, vec3 rd){
+
+} \ No newline at end of file
diff --git a/resources/shaders/main.glsl b/resources/shaders/main.glsl
index 7d4067a..2888d56 100644
--- a/resources/shaders/main.glsl
+++ b/resources/shaders/main.glsl
@@ -18,9 +18,76 @@ uniform float time;
out vec3 color;
-void main(){
- vec2 coord=gl_FragCoord.xy/resolution;
- coord-=0.5;
- float d=length(coord);
- color=vec3(d,1,1);
+
+#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;
}
diff --git a/resources/shaders/objects/sphere.glsl b/resources/shaders/objects/sphere.glsl
new file mode 100644
index 0000000..a3d25eb
--- /dev/null
+++ b/resources/shaders/objects/sphere.glsl
@@ -0,0 +1,4 @@
+
+float Sphere(vec3 ray_position, vec3 sphere_position){
+
+} \ No newline at end of file