aboutsummaryrefslogtreecommitdiffstats
path: root/shaders/compute.comp
diff options
context:
space:
mode:
Diffstat (limited to 'shaders/compute.comp')
-rw-r--r--shaders/compute.comp59
1 files changed, 22 insertions, 37 deletions
diff --git a/shaders/compute.comp b/shaders/compute.comp
index 75773b4..feefbe6 100644
--- a/shaders/compute.comp
+++ b/shaders/compute.comp
@@ -33,6 +33,8 @@ layout(set = 0, binding = 0) buffer Inputs {
float[200] random_numbers;
+ vec4[1000] random_in_sphere;
+
sphere[2] spheres;
uint max_bounce;
@@ -45,30 +47,16 @@ vec3 at(ray r, float t) {
return r.origin + r.direction * t;
}
-float rand(vec2 co){
- return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
-}
-
-float rand(vec2 co, float min, float max){
- return min + (max - min) * rand(co);
-}
-
-vec3 rand_vec3(vec2 co) {
- return vec3(rand(co), rand(vec2(co.y, co.x)), rand(vec2(co.x, co.x)));
-}
-
-vec3 rand_vec3(vec2 co, float min, float max) {
- return vec3(rand(co, min, max), rand(co.xy * co.x, min, max), rand(co.xy * co.y, min, max));
+vec3 to_hemisphere_vec(vec3 unit_vec, vec3 normal) {
+ if (dot(unit_vec, normal) > 0.0) {
+ return unit_vec;
+ } else {
+ return -unit_vec;
+ }
}
-vec3 rand_unit_sphere(vec2 co) {
- uint i = 0;
- while(true) {
- vec3 vec = rand_vec3(i++ * co, -1.0, 1.0);
- if (length(vec) <= 1.0) {
- return vec;
- }
- }
+float rand(vec2 co) {
+ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
bool hit_sphere(sphere s, ray r, float min_t, float max_t, out hit_info info) {
@@ -103,14 +91,14 @@ bool hit_sphere(sphere s, ray r, float min_t, float max_t, out hit_info info) {
return true;
}
-bool hit_spheres(ray r, out hit_info info) {
- float min_t = 1e20;
+bool hit_spheres(ray r, float min_t, float max_t, out hit_info info) {
+ float closest_t = max_t;
hit_info temp_info;
bool hit = false;
for (uint sphere_index = 0; sphere_index < 2; sphere_index++) {
- if (hit_sphere(spheres[sphere_index], r, 0.0, min_t, temp_info)) {
+ if (hit_sphere(spheres[sphere_index], r, min_t, closest_t, temp_info)) {
info = temp_info;
- min_t = temp_info.t;
+ closest_t = temp_info.t;
hit = true;
}
}
@@ -122,9 +110,12 @@ vec4 ray_color(ray r, uint sample_index) {
hit_info info;
uint bounces = 0;
- while (hit_spheres(r, info) && bounces < max_bounce) {
- vec3 target = info.point + info.normal + rand_unit_sphere(info.point.xy);
- r = ray(info.point, target - info.point);
+ ray current_ray = r;
+ while (hit_spheres(current_ray, 0.0001, 1e15, info) && bounces < max_bounce) {
+ vec2 seed = vec2(info.point.x * sample_index, info.point.y * bounces) * gl_GlobalInvocationID.xy;
+ vec3 unit_hemisphere_vec = to_hemisphere_vec(random_in_sphere[uint(rand(seed) * 999.0)].xyz, info.normal);
+ vec3 target = info.point + info.normal + unit_hemisphere_vec;
+ current_ray = ray(info.point, target - info.point);
bounces++;
}
@@ -133,13 +124,6 @@ vec4 ray_color(ray r, uint sample_index) {
}
return pow(0.5, bounces) * mix(ground_color, sky_color, (normalize(r.direction).y + 1.0) * 0.5);
-
- // No lambertian
- // if (hit_spheres(r, info)) {
- // return vec4(0.5 * (info.normal + vec3(1.0)), 0.0);
- // }
-
- // return mix(ground_color, sky_color, (normalize(r.direction).y + 1.0) * 0.5);
}
void main() {
@@ -160,5 +144,6 @@ void main() {
image[y * width + x] += ray_color(ray(camera_pos.xyz, proj_plane_pos - camera_pos.xyz), sample_index);
}
- image[y * width + x] /= samples_per_pixel;
+ float spp_scale = (1.0 / samples_per_pixel);
+ image[y * width + x] = sqrt(image[y * width + x] * spp_scale);
}