diff --git a/extra/Screenshot_20230414_163233.png b/extra/Screenshot_20230414_163233.png new file mode 100644 index 0000000..7793cea Binary files /dev/null and b/extra/Screenshot_20230414_163233.png differ diff --git a/extra/example-scene.blend b/extra/example-scene.blend new file mode 100644 index 0000000..15c9080 Binary files /dev/null and b/extra/example-scene.blend differ diff --git a/extra/example-scene.blend1 b/extra/example-scene.blend1 new file mode 100644 index 0000000..91bfdec Binary files /dev/null and b/extra/example-scene.blend1 differ diff --git a/extra/reference.png b/extra/reference.png new file mode 100644 index 0000000..dd4432c Binary files /dev/null and b/extra/reference.png differ diff --git a/src/shader/pathtracing/bsdf.glsl b/src/shader/pathtracing/bsdf.glsl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/shader/pathtracing/bsdf.glsl @@ -0,0 +1 @@ + diff --git a/src/shader/pathtracing/pathtracer.comp b/src/shader/pathtracing/pathtracer.comp index 47dafd5..523f212 100644 --- a/src/shader/pathtracing/pathtracer.comp +++ b/src/shader/pathtracing/pathtracer.comp @@ -3,6 +3,7 @@ #include "rand/random.glsl" #include "raytracing/raytracing.glsl" #include "raytracing/camera.glsl" +#include "bsdf.glsl" layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; @@ -32,8 +33,8 @@ vec3 project(in vec3 a, in vec3 b) { void construct_orthonormal_basis(in vec3 up, out vec3 u, out vec3 v, out vec3 w) { u = normalize(up); - vec3 n2 = vec3(1) - u; - vec3 n3 = vec3(1) - u.zxy; + vec3 n2 = normalize(cross(up, vec3(0, 1.0, 1.0))); + vec3 n3 = cross(u, n2); vec3 w2 = normalize(n2 - (project(u, n2))); vec3 w3 = normalize(n3 - project(u, n3) - project(w2, n3)); @@ -64,6 +65,28 @@ vec3 generate_diffuse_ray_direction(in vec3 nor) { return normalize(u * hemisphere.x + v * hemisphere.y + w * hemisphere.z); } +vec3 trace_direct(in Ray direct_ray) { + Hit hit = intersect_scene(direct_ray); + + if (hit.depth < direct_ray.far) { + + Ray ray; + ray.origin = direct_ray.origin + direct_ray.direction * hit.depth; + ray.direction = generate_diffuse_ray_direction(hit.nor); + ray.near = 1e-3; + ray.far = 1.0; + + Hit hit = intersect_scene(ray); + if (hit.depth == 1.0) { + return vec3(1); + } + + return vec3(0); + } + + return vec3(0); +} + void main() { init_random_state(floatBitsToInt(program_metadata.seconds)); @@ -71,23 +94,7 @@ void main() { Ray camera_ray = construct_camera_ray_pinhole(uv); - vec3 color = vec3(0); - - Hit result = intersect_scene(camera_ray); - - if (result.depth < camera_ray.far) { - Ray ao; - ao.origin = camera_ray.origin + camera_ray.direction * result.depth; - ao.direction = generate_diffuse_ray_direction(result.nor); - ao.near = 1e-3; - ao.far = 1e3; - - Hit r2 = intersect_scene(ao); - - if (r2.depth > 1.0) { - color = vec3(1); - } - } + vec3 color = trace_direct(camera_ray); // index of the current pixel as array index uint pixel_index = get_pixel_index(); diff --git a/src/shader/pathtracing/raytracing/raytracing.glsl b/src/shader/pathtracing/raytracing/raytracing.glsl index ebef48c..79fd175 100644 --- a/src/shader/pathtracing/raytracing/raytracing.glsl +++ b/src/shader/pathtracing/raytracing/raytracing.glsl @@ -54,7 +54,7 @@ Hit intersect_scene(in Ray ray) { if (result.x > ray.near && result.x < hit.depth) { hit.uv = result.yz; hit.depth = result.x; - hit.nor = n; + hit.nor = normalize(n); } }