oglc/shader/root/rt.glsl

116 lines
2.9 KiB
Plaintext
Raw Normal View History

2021-07-24 02:31:35 +02:00
#version 430
layout(local_size_x = 1, local_size_y = 1) in; // size of local work group - 1 pixel
// gbuffer?
layout(rgba32f, binding = 2) readonly uniform image2D _g0;
2021-08-13 21:03:19 +02:00
layout(rgba32f, binding = 3) readonly uniform image2D _g1;
2021-08-10 02:11:22 +02:00
// final output
2021-08-03 00:32:47 +02:00
layout(rgba32f, binding = 0) uniform image2D img_output; // rgba32f defines internal format, image2d for random write to output texture
2021-08-07 18:50:24 +02:00
2021-08-13 21:03:19 +02:00
uniform vec3 _skyColor = vec3(0.68,0.85,0.9);
2021-08-10 02:11:22 +02:00
// TODO: some of these depend on each other!! need be be in this order for now c:
#include func.glsl
#include constants.glsl
#include time.glsl
#include sphere.glsl
#include ray.glsl
#include intersect.glsl
#include random.glsl
#include camera.glsl
#include image.glsl
// scene.glsl includes scene trace function
#include scene.glsl
#include lighting.glsl
2023-02-24 02:12:51 +01:00
#include depth.glsl
2021-08-07 18:50:24 +02:00
vec3 shade(inout Ray ray, RayHit hit)
{
if (hit.distance < INF)
{
2022-01-30 23:01:02 +01:00
switch (hit.material)
{
case MAT_SKY: break;
case MAT_LAMBERT:
scatterLambert(ray, hit);
break;
case MAT_CHROME:
return scatterMetal(ray, hit);
break;
}
2021-08-07 18:50:24 +02:00
}
// sky color
2021-08-13 21:03:19 +02:00
return _skyColor;
2021-08-07 18:50:24 +02:00
}
2021-07-24 02:31:35 +02:00
void main()
{
// base pixel colour for the image
vec4 pixel = vec4(0.0, 0.0, 0.0, 1.0);
ivec2 pixelCoords = ivec2(gl_GlobalInvocationID.xy);
ivec2 dims = imageSize(img_output);
2021-07-24 02:31:35 +02:00
vec2 uv = pixelUv(pixelCoords, dims);
2021-08-02 10:35:39 +02:00
2021-08-13 21:03:19 +02:00
vec4 g[2];
2021-08-13 20:12:39 +02:00
// load data from first pass
2021-08-13 21:03:19 +02:00
g[0] = imageLoad(_g0, ivec2(gl_GlobalInvocationID.xy));
float depth = g[0].w;
vec3 normal = g[0].xyz*2.0-1.0; // unpack normal packaged into texture
g[1] = imageLoad(_g1, ivec2(gl_GlobalInvocationID.xy));
vec3 albedo = g[1].xyz;
2021-08-13 20:12:39 +02:00
// 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;
2021-08-13 21:03:19 +02:00
firstHit.albedo = albedo;
2021-08-07 18:50:24 +02:00
2021-08-13 21:03:19 +02:00
int sky = depth >= INF ? 1 : 0;
int bounces = (1-sky) * BOUNCES;
pixel.xyz = mix(pixel.xyz, _skyColor, sky);
2021-08-07 18:50:24 +02:00
2023-02-24 02:15:25 +01:00
// sample
int samples = 2;
for (int i = 0; i < samples; i++)
2021-08-13 20:12:39 +02:00
{
2023-02-24 02:15:25 +01:00
float sampleDepth = 0;
2021-08-13 20:12:39 +02:00
2023-02-24 02:15:25 +01:00
// trace the ray's path around the scene
for (int j = 0; j < bounces; j++)
{
RayHit hit = trace(ray);
depth = getLogarithmicDepth(ray.distance);
2023-02-24 02:12:51 +01:00
2023-02-24 02:15:25 +01:00
pixel.xyz += ray.energy * shade(ray, hit);
if (length(ray.energy) < 0.001) break;
}
2021-08-08 17:47:25 +02:00
2023-02-24 02:15:25 +01:00
depth += sampleDepth / float(samples);
2021-08-06 20:25:52 +02:00
}
2023-02-26 04:28:26 +01:00
// include the first sample we took
samples++;
// gamma correction
float scale = 1.0 / samples;
pixel.xyz = sqrt(scale * pixel.xyz);
2021-08-13 14:43:54 +02:00
pixel.xyz = mix(pixel.xyz, vec3(1.0), depth);
2023-03-01 01:11:29 +01:00
pixel.xyz = texture(_noise, uv*.5-.5).xyz;
2021-07-24 02:31:35 +02:00
// output to a specific pixel in the image
2021-08-10 02:11:22 +02:00
imageStore(img_output, ivec2(gl_GlobalInvocationID.xy), pixel);
2021-07-24 02:31:35 +02:00
}