shader-web-test/raymarcher.glsl

74 lines
1.9 KiB
GLSL

#version 300 es
precision highp float;
// Inputs
in vec2 texture_coordinates;
uniform float time;
uniform sampler2D uSampler1;
uniform sampler2D uSampler2;
uniform vec3 camera_pos;
uniform vec3 camera_rot[3];
// Output
out vec4 color;
const float PI = 3.1415;
// Raymarching variables
#define MAX_ITERATIONS 20
#define MIN_TOLERANCE .01
//const vec3 camera_pos = vec3(0.);
const vec3 color1 = vec3(0.494, 0.361, 0.678);
const vec3 color2 = vec3(0.18, 0.945, 0.975);
// Scene Object (sphere)
// returns the distance from the ray to this sphere in the scene
float sphere_render(vec3 ray_pos, float radius, vec3 sphere_pos) {
return distance(ray_pos, sphere_pos) - radius;
}
float remap11(float val) {
return ((val - .5) * 2.);
}
// returns a vec3 of the vector transformed by the matrix
vec3 mat3_vec_mul(vec3 m[3], vec3 v) {
return v.x * m[0] + v.y * m[1] + v.z * m[2];
}
void main() {
// Set up camera and sphere object
vec3 ray_dir = normalize(vec3(remap11(texture_coordinates.x), remap11(texture_coordinates.y), 1.));
ray_dir = mat3_vec_mul(camera_rot, ray_dir);
vec3 ray_pos = camera_pos;
const vec3 sphere_pos = vec3(0., 0., 3.);
const float rad = 1.;
int i = 0;
for (; i < MAX_ITERATIONS; i++) {
float distance = sphere_render(ray_pos, rad, sphere_pos);
// Check If within tolerances
if (distance < MIN_TOLERANCE) {
break;
}
ray_pos += (distance * ray_dir);
}
color = vec4(mix(color1, color2, float(i) / float(MAX_ITERATIONS)), 1.);
// Image stuff for later
/*
if ((texture_coordinates.x + texture_coordinates.y) > 1.) {
color = texture(uSampler1, texture_coordinates);
}
else {
color = texture(uSampler2, texture_coordinates);
}*/
// Basic color time shift
// color = vec4( texture_coordinates, (sin( time * PI) + 1.)/2. , 1.);
}