use first pass depth and normal data

This commit is contained in:
ktyl 2021-08-13 19:12:39 +01:00
parent b312d390da
commit 9b61093de4
6 changed files with 31 additions and 26 deletions

View File

@ -1,5 +1,5 @@
const float INF = 100.0; const float INF = 17.0;
const float PI = 3.14159; const float PI = 3.14159;
const float E = 2.71828; const float E = 2.71828;
const int SAMPLES = 1; const int SAMPLES = 1;
const int BOUNCES = 4; const int BOUNCES = 8;

View File

@ -43,27 +43,33 @@ void main()
vec2 uv = pixelUv(pixelCoords, dims); vec2 uv = pixelUv(pixelCoords, dims);
for (int i = 0; i < SAMPLES; i++) // load data from first pass
{
// create a ray from the uv
Ray ray = createCameraRay(uv);
// trace the rays path around the scene
for (int j = 0; j < BOUNCES; j++)
{
RayHit hit = trace(ray);
pixel.xyz += ray.energy * shade(ray, hit);
if (length(ray.energy) < 0.001) break;
}
}
pixel.xyz /= SAMPLES;
vec4 d = imageLoad(_g0, ivec2(gl_GlobalInvocationID.xy)); vec4 d = imageLoad(_g0, ivec2(gl_GlobalInvocationID.xy));
float depth = d.w; float depth = d.w;
vec3 normal = d.xyz*2.0-1.0; // unpack normal packaged into texture vec3 normal = d.xyz*2.0-1.0; // unpack normal packaged into texture
// create a ray from the uv
Ray ray = createCameraRay(uv);
RayHit firstHit;
firstHit.position = ray.origin+ray.direction*depth;
firstHit.distance = depth;
firstHit.normal = normal;
firstHit.albedo = vec3(1.0,1.0,1.0);
// do a trace using precomputed depth and surface normal values
//RayHit hit = trace(ray);
// trace the rays path around the scene
for (int j = 1; j < BOUNCES; j++)
{
RayHit hit = trace(ray);
pixel.xyz += ray.energy * shade(ray, hit);
if (length(ray.energy) < 0.001) break;
}
//pixel.xyz = mix(pixel.xyz, normal, 1.0-depth); //pixel.xyz = mix(pixel.xyz, normal, 1.0-depth);
pixel.xyz = mix(pixel.xyz, vec3(1.0), depth); pixel.xyz = mix(pixel.xyz, vec3(1.0), depth);

View File

@ -35,7 +35,7 @@ void main()
// n roughly correlates to steepness of log curve // n roughly correlates to steepness of log curve
// TODO: what does this mean in mathematical terms?? // TODO: what does this mean in mathematical terms??
float n = 3; float n = 1.0;
float f = INF; float f = INF;
float z = hit.distance; float z = hit.distance;

View File

@ -1,4 +1,3 @@
#include "main.h" #include "main.h"
#include "gfx.h" #include "gfx.h"
#include "clock.h" #include "clock.h"

View File

@ -26,7 +26,7 @@ void makeSpheres(struct Sphere *spheres, int count)
{ {
x = 2.0*CGLM_PI * (float)i/(float)count; x = 2.0*CGLM_PI * (float)i/(float)count;
sc[0] = sin(x)*d; sc[0] = sin(x)*d;
sc[1] = sin(x*3.0-t); sc[1] = sin(x*3.0-5.0*sin(t));
sc[2] = cos(x)*d; sc[2] = cos(x)*d;
float ic = i/(float)count*CGLM_PI*2.0; float ic = i/(float)count*CGLM_PI*2.0;

View File

@ -14,10 +14,10 @@
* [ ] do a 'fract * [ ] do a 'fract
* [-] depth * [-] depth
* [x] acquire value * [x] acquire value
* [ ] acquire randomness * [x] acquire randomness
* [ ] acceleration time ! * [-] acceleration time !
* [ ] auxiliary textures * [-] auxiliary textures
* [ ] depth buffer * [x] depth buffer
* [ ] frame blending * [ ] frame blending
* [ ] maybe do some fractals * [ ] maybe do some fractals
* [ ] mandelbrot * [ ] mandelbrot