diff options
Diffstat (limited to 'shaders')
| -rw-r--r-- | shaders/api-test-ui.frag | 25 | ||||
| -rw-r--r-- | shaders/compute.comp | 54 | ||||
| -rw-r--r-- | shaders/include/ray.h | 54 | ||||
| -rw-r--r-- | shaders/test.comp | 20 | ||||
| -rw-r--r-- | shaders/tonemapping.comp | 38 | ||||
| -rw-r--r-- | shaders/transmittance_lut.comp | 7 |
6 files changed, 75 insertions, 123 deletions
diff --git a/shaders/api-test-ui.frag b/shaders/api-test-ui.frag index 8da6369..ad2ea21 100644 --- a/shaders/api-test-ui.frag +++ b/shaders/api-test-ui.frag @@ -1,5 +1,6 @@ #extension GL_EXT_buffer_reference : require
#extension GL_EXT_nonuniform_qualifier : require
+#extension GL_EXT_descriptor_heap : require
layout(location = 0) out vec4 o_Color;
@@ -8,17 +9,9 @@ layout(location = 0) in struct { vec4 color;
} In;
-layout(set = 0, binding = 0) uniform sampler samplers[];
-layout(set = 0, binding = 1) uniform texture2D textures[];
-layout(set = 0, binding = 2, rgba32f) uniform image2D images[];
-
-layout(buffer_reference) readonly buffer global_params {
- uint padding;
-};
-
-layout(buffer_reference) readonly buffer pass_params {
- uint padding;
-};
+layout(descriptor_heap) uniform texture2D textures[];
+layout(descriptor_heap, rgba32f) uniform image2D images[];
+layout(descriptor_heap) uniform sampler samplers[];
struct vertex {
float pos_x;
@@ -32,19 +25,13 @@ layout(buffer_reference) readonly buffer vertices { vertex vertices[];
};
-layout(buffer_reference) readonly buffer draw_params {
+layout(push_constant) uniform registers {
vertices vertex_buffer;
vec2 scale;
vec2 translate;
uint texture_index;
-};
-
-layout(push_constant) uniform registers {
- global_params globals;
- pass_params pass;
- draw_params draw;
} regs;
void main() {
- o_Color = In.color * texture(sampler2D(textures[nonuniformEXT(regs.draw.texture_index)], samplers[nonuniformEXT(0U)]), In.uv.xy);
+ o_Color = In.color * texture(sampler2D(textures[nonuniformEXT(regs.texture_index)], samplers[nonuniformEXT(0U)]), In.uv.xy);
}
diff --git a/shaders/compute.comp b/shaders/compute.comp index 934ff70..c361c43 100644 --- a/shaders/compute.comp +++ b/shaders/compute.comp @@ -5,6 +5,7 @@ #extension GL_EXT_buffer_reference : require #extension GL_EXT_nonuniform_qualifier : require +#extension GL_EXT_descriptor_heap : require #include "math.h" #include "color_utils.h" @@ -90,7 +91,11 @@ layout(buffer_reference) readonly buffer nodes_array { bvh_node[] nodes; }; -layout(buffer_reference) readonly buffer global_params { +layout(descriptor_heap) uniform texture2D textures[]; +layout(descriptor_heap, rgba32f) uniform image2D images[]; +layout(descriptor_heap) uniform sampler samplers[]; + +layout(push_constant) uniform registers { camera cam; uint max_bounce; @@ -102,13 +107,7 @@ layout(buffer_reference) readonly buffer global_params { uint enable_dof; uint debug_bvh; int downscale_factor; -}; - -layout(buffer_reference) readonly buffer pass_params { - uint padding; -}; -layout(buffer_reference) readonly buffer draw_params { nodes_array bvh; indices_array indices_arr; positions_array positions_arr; @@ -117,17 +116,6 @@ layout(buffer_reference) readonly buffer draw_params { materials_array materials_arr; uint output_image_index; uint accumulation_image_index; - uint padding[2]; -}; - -layout(set = 0, binding = 0) uniform sampler samplers[]; -layout(set = 0, binding = 1) uniform texture2D textures[]; -layout(set = 0, binding = 2, rgba32f) uniform image2D images[]; - -layout(push_constant) uniform registers { - global_params globals; - pass_params pass; - draw_params draw; } regs; #include "ray.h" @@ -137,7 +125,7 @@ vec3 ray_color(ray r, uint seed) { vec3 radiance = vec3(0.0); vec3 throughput = vec3(1.0); - for (uint bounce = 0; bounce < regs.globals.max_bounce; bounce++) { + for (uint bounce = 0; bounce < regs.max_bounce; bounce++) { if (!hit_node(r, info)) return throughput * vec3(1.0); @@ -247,7 +235,7 @@ vec3 ray_color(ray r, uint seed) { // Russian Roulette // As the throughput gets smaller, the ray is more likely to get terminated early. // Survivors have their value boosted to make up for fewer samples being in the average. - if (bounce > regs.globals.min_bounce) { + if (bounce > regs.min_bounce) { float probability = min(0.95f, luminance(throughput)); if (probability < rand(seed)) break; throughput /= probability; @@ -258,42 +246,42 @@ vec3 ray_color(ray r, uint seed) { } ray generate_camera_ray(ivec2 coords, uint seed) { - vec2 scene_size = vec2(regs.globals.width - 1, regs.globals.height - 1); + vec2 scene_size = vec2(regs.width - 1, regs.height - 1); vec2 uv = vec2(coords.x / scene_size.x, 1.0 - coords.y / scene_size.y); vec2 rand_disk = disk_vec(vec2(rand(seed), rand(seed))); vec2 jittered_uvs = uv + vec2(rand(seed), rand(seed)) / scene_size; vec2 lens_disk = vec2(0.0); - if (regs.globals.enable_dof == 1) { - lens_disk = rand_disk * regs.globals.cam.lens_radius; + if (regs.enable_dof == 1) { + lens_disk = rand_disk * regs.cam.lens_radius; } - vec3 offset = lens_disk.x * regs.globals.cam.right.xyz + lens_disk.y * regs.globals.cam.up.xyz; - vec3 proj_plane_pos = regs.globals.cam.first_pixel.xyz + jittered_uvs.x * regs.globals.cam.horizontal.xyz + jittered_uvs.y * regs.globals.cam.vertical.xyz; + vec3 offset = lens_disk.x * regs.cam.right.xyz + lens_disk.y * regs.cam.up.xyz; + vec3 proj_plane_pos = regs.cam.first_pixel.xyz + jittered_uvs.x * regs.cam.horizontal.xyz + jittered_uvs.y * regs.cam.vertical.xyz; - return ray(regs.globals.cam.position.xyz + offset, proj_plane_pos.xyz - regs.globals.cam.position.xyz - offset, 0.001f, 1e15); + return ray(regs.cam.position.xyz + offset, proj_plane_pos.xyz - regs.cam.position.xyz - offset, 0.001f, 1e15); } void main() { - if (any(greaterThanEqual(gl_GlobalInvocationID.xy, uvec2(regs.globals.width, regs.globals.height)))) + if (any(greaterThanEqual(gl_GlobalInvocationID.xy, uvec2(regs.width, regs.height)))) return; - ivec2 coords = ivec2(gl_GlobalInvocationID.xy) * regs.globals.downscale_factor; + ivec2 coords = ivec2(gl_GlobalInvocationID.xy) * regs.downscale_factor; - uint seed = uint(coords.x * uint(1973) + coords.y * uint(9277) + regs.globals.sample_index * uint(26699)) | uint(1); + uint seed = uint(coords.x * uint(1973) + coords.y * uint(9277) + regs.sample_index * uint(26699)) | uint(1); ray r = generate_camera_ray(coords, seed); vec3 out_color = vec3(0.0); - if (regs.globals.debug_bvh == 1) { + if (regs.debug_bvh == 1) { out_color = hit_aabbs(r) * vec3(0.001, 0.0, 0.0); } else { out_color = ray_color(r, seed); } // TODO: what is going on with srgb here ? - float spp_scale = (1.0 / regs.globals.sample_index); - vec3 acc_color = srgb_to_linear(imageLoad(images[nonuniformEXT(regs.draw.accumulation_image_index)], coords).xyz); + float spp_scale = (1.0 / regs.sample_index); + vec3 acc_color = srgb_to_linear(imageLoad(images[nonuniformEXT(regs.accumulation_image_index)], coords).xyz); out_color = linear_to_srgb(mix(acc_color, out_color, spp_scale)); - imageStore(images[nonuniformEXT(regs.draw.output_image_index)], coords, vec4(out_color, 1.0)); + imageStore(images[nonuniformEXT(regs.output_image_index)], coords, vec4(out_color, 1.0)); } diff --git a/shaders/include/ray.h b/shaders/include/ray.h index 2e9980b..7a6cc21 100644 --- a/shaders/include/ray.h +++ b/shaders/include/ray.h @@ -18,38 +18,38 @@ struct hit_info { };
uvec4 decode_triangle_indices(uint triangle_id) {
- uint id1 = regs.draw.indices_arr.indices[triangle_id * 3] & 0x00ffffff;
- uint id2 = regs.draw.indices_arr.indices[triangle_id * 3 + 1] & 0x00ffffff;
- uint id3 = regs.draw.indices_arr.indices[triangle_id * 3 + 2] & 0x00ffffff;
+ uint id1 = regs.indices_arr.indices[triangle_id * 3] & 0x00ffffff;
+ uint id2 = regs.indices_arr.indices[triangle_id * 3 + 1] & 0x00ffffff;
+ uint id3 = regs.indices_arr.indices[triangle_id * 3 + 2] & 0x00ffffff;
- uint mat_id = (regs.draw.indices_arr.indices[triangle_id * 3] & 0xff000000) >> 8
- | (regs.draw.indices_arr.indices[triangle_id * 3 + 1] & 0xff000000) >> 16
- | (regs.draw.indices_arr.indices[triangle_id * 3 + 2] & 0xff000000) >> 24;
+ uint mat_id = (regs.indices_arr.indices[triangle_id * 3] & 0xff000000) >> 8
+ | (regs.indices_arr.indices[triangle_id * 3 + 1] & 0xff000000) >> 16
+ | (regs.indices_arr.indices[triangle_id * 3 + 2] & 0xff000000) >> 24;
return uvec4(id1, id2, id3, mat_id);
}
vec3[3] get_triangle_positions(uvec3 indices) {
return vec3[3](
- vec3(regs.draw.positions_arr.positions[indices[0] * 3], regs.draw.positions_arr.positions[indices[0] * 3 + 1], regs.draw.positions_arr.positions[indices[0] * 3 + 2]),
- vec3(regs.draw.positions_arr.positions[indices[1] * 3], regs.draw.positions_arr.positions[indices[1] * 3 + 1], regs.draw.positions_arr.positions[indices[1] * 3 + 2]),
- vec3(regs.draw.positions_arr.positions[indices[2] * 3], regs.draw.positions_arr.positions[indices[2] * 3 + 1], regs.draw.positions_arr.positions[indices[2] * 3 + 2])
+ vec3(regs.positions_arr.positions[indices[0] * 3], regs.positions_arr.positions[indices[0] * 3 + 1], regs.positions_arr.positions[indices[0] * 3 + 2]),
+ vec3(regs.positions_arr.positions[indices[1] * 3], regs.positions_arr.positions[indices[1] * 3 + 1], regs.positions_arr.positions[indices[1] * 3 + 2]),
+ vec3(regs.positions_arr.positions[indices[2] * 3], regs.positions_arr.positions[indices[2] * 3 + 1], regs.positions_arr.positions[indices[2] * 3 + 2])
);
}
vec3[3] get_triangle_normals(uvec3 indices) {
return vec3[3](
- vec3(regs.draw.normals_arr.normals[indices[0] * 3], regs.draw.normals_arr.normals[indices[0] * 3 + 1], regs.draw.normals_arr.normals[indices[0] * 3 + 2]),
- vec3(regs.draw.normals_arr.normals[indices[1] * 3], regs.draw.normals_arr.normals[indices[1] * 3 + 1], regs.draw.normals_arr.normals[indices[1] * 3 + 2]),
- vec3(regs.draw.normals_arr.normals[indices[2] * 3], regs.draw.normals_arr.normals[indices[2] * 3 + 1], regs.draw.normals_arr.normals[indices[2] * 3 + 2])
+ vec3(regs.normals_arr.normals[indices[0] * 3], regs.normals_arr.normals[indices[0] * 3 + 1], regs.normals_arr.normals[indices[0] * 3 + 2]),
+ vec3(regs.normals_arr.normals[indices[1] * 3], regs.normals_arr.normals[indices[1] * 3 + 1], regs.normals_arr.normals[indices[1] * 3 + 2]),
+ vec3(regs.normals_arr.normals[indices[2] * 3], regs.normals_arr.normals[indices[2] * 3 + 1], regs.normals_arr.normals[indices[2] * 3 + 2])
);
}
vec2[3] get_triangle_uvs(uvec3 indices) {
return vec2[3](
- vec2(regs.draw.uvs_arr.uvs[indices[0] * 2], regs.draw.uvs_arr.uvs[indices[0] * 2 + 1]),
- vec2(regs.draw.uvs_arr.uvs[indices[1] * 2], regs.draw.uvs_arr.uvs[indices[1] * 2 + 1]),
- vec2(regs.draw.uvs_arr.uvs[indices[2] * 2], regs.draw.uvs_arr.uvs[indices[2] * 2 + 1])
+ vec2(regs.uvs_arr.uvs[indices[0] * 2], regs.uvs_arr.uvs[indices[0] * 2 + 1]),
+ vec2(regs.uvs_arr.uvs[indices[1] * 2], regs.uvs_arr.uvs[indices[1] * 2 + 1]),
+ vec2(regs.uvs_arr.uvs[indices[2] * 2], regs.uvs_arr.uvs[indices[2] * 2 + 1])
);
}
@@ -59,7 +59,7 @@ triangle get_triangle(uint triangle_id) { get_triangle_positions(indices.xyz),
get_triangle_normals(indices.xyz),
get_triangle_uvs(indices.xyz),
- regs.draw.materials_arr.materials[indices.w]
+ regs.materials_arr.materials[indices.w]
);
}
@@ -82,20 +82,20 @@ uint hit_aabbs(ray r) { int id = 0;
while(id != -1) {
- if (regs.draw.bvh.nodes[id].primitive_id != -1) {
- // triangle tri = bufs.geometry.triangles[regs.draw.bvh.nodes[id].primitive_id];
+ if (regs.bvh.nodes[id].primitive_id != -1) {
+ // triangle tri = bufs.geometry.triangles[regs.bvh.nodes[id].primitive_id];
// vec3 minimum = min(tri.v1.position, min(tri.v2.position, tri.v3.position)).xyz;
// vec3 maximum = max(tri.v1.position, max(tri.v2.position, tri.v3.position)).xyz;
// if (hit_aabb(minimum, maximum, r)) {
// hit_count++;
// }
- id = regs.draw.bvh.nodes[id].next_id;
- } else if (hit_aabb(regs.draw.bvh.nodes[id].min, regs.draw.bvh.nodes[id].max, r)) {
+ id = regs.bvh.nodes[id].next_id;
+ } else if (hit_aabb(regs.bvh.nodes[id].min, regs.bvh.nodes[id].max, r)) {
hit_count++;
id++;
} else {
- id = regs.draw.bvh.nodes[id].next_id;
+ id = regs.bvh.nodes[id].next_id;
}
}
@@ -169,22 +169,22 @@ bool hit_node(ray r, out hit_info info) { while(id != -1) {
// Leafs
- if (regs.draw.bvh.nodes[id].primitive_id != -1) {
- // if (hit_sphere(bufs.geometry.spheres[regs.draw.bvh.nodes[id].primitive_id], r, temp_info)) {
+ if (regs.bvh.nodes[id].primitive_id != -1) {
+ // if (hit_sphere(bufs.geometry.spheres[regs.bvh.nodes[id].primitive_id], r, temp_info)) {
// info = temp_info;
// r.max_t = temp_info.t;
// hit = true;
// }
- if (hit_triangle(regs.draw.bvh.nodes[id].primitive_id, r, temp_info)) {
+ if (hit_triangle(regs.bvh.nodes[id].primitive_id, r, temp_info)) {
info = temp_info;
r.max_t = temp_info.t;
hit = true;
}
- id = regs.draw.bvh.nodes[id].next_id;
- } else if (hit_aabb(regs.draw.bvh.nodes[id].min, regs.draw.bvh.nodes[id].max, r)) {
+ id = regs.bvh.nodes[id].next_id;
+ } else if (hit_aabb(regs.bvh.nodes[id].min, regs.bvh.nodes[id].max, r)) {
id++;
} else {
- id = regs.draw.bvh.nodes[id].next_id;
+ id = regs.bvh.nodes[id].next_id;
}
}
diff --git a/shaders/test.comp b/shaders/test.comp index 3a4230f..b2ddf1c 100644 --- a/shaders/test.comp +++ b/shaders/test.comp @@ -1,29 +1,27 @@ #extension GL_EXT_buffer_reference : require #extension GL_EXT_nonuniform_qualifier : require +#extension GL_EXT_descriptor_heap : require layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; -layout(set = 0, binding = 0) uniform sampler samplers[]; -layout(set = 0, binding = 1) uniform texture2D textures[]; -layout(set = 0, binding = 2, rgba32f) uniform image2D images[]; +layout(descriptor_heap) uniform texture2D textures[]; +layout(descriptor_heap, rgba32f) uniform image2D images[]; +layout(descriptor_heap) uniform sampler samplers[]; -layout(buffer_reference) readonly buffer draw_params { + +layout(push_constant) uniform buffers { uint input_id1; uint input_id2; uint output_id; uint pad; -}; - -layout(push_constant) uniform buffers { - layout(offset = 16) draw_params draw; } regs; void main() { ivec2 coords = ivec2(gl_GlobalInvocationID.xy); float t = 0.5; - vec3 color_1 = imageLoad(images[nonuniformEXT(regs.draw.input_id1)], coords).xyz; - vec3 color_2 = imageLoad(images[nonuniformEXT(regs.draw.input_id2)], coords).xyz; + vec3 color_1 = imageLoad(images[nonuniformEXT(regs.input_id1)], coords).xyz; + vec3 color_2 = imageLoad(images[nonuniformEXT(regs.input_id2)], coords).xyz; vec3 out_color = (t * color_1) + ((1.0 - t) * color_2); - imageStore(images[nonuniformEXT(regs.draw.output_id)], coords, vec4(out_color, 1.0)); + imageStore(images[nonuniformEXT(regs.output_id)], coords, vec4(out_color, 1.0)); } diff --git a/shaders/tonemapping.comp b/shaders/tonemapping.comp index 65251df..ed30c92 100644 --- a/shaders/tonemapping.comp +++ b/shaders/tonemapping.comp @@ -1,9 +1,10 @@ #extension GL_EXT_buffer_reference : require
#extension GL_EXT_nonuniform_qualifier : require
+#extension GL_EXT_descriptor_heap : require
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-layout(set = 0, binding = 2, rgba32f) uniform image2D images[];
+layout(descriptor_heap, rgba32f) uniform image2D images[];
struct camera {
vec4 position;
@@ -22,44 +23,21 @@ struct camera { float aspect_ratio;
};
-layout(buffer_reference) readonly buffer global_params {
- camera cam;
-
- uint max_bounce;
- uint min_bounce;
- uint width;
- uint height;
-
- uint sample_index;
- uint enable_dof;
- uint debug_bvh;
+layout(push_constant) uniform registers {
int downscale_factor;
-};
-
-layout(buffer_reference) readonly buffer pass_params {
- uint padding;
-};
-
-layout(buffer_reference) readonly buffer draw_params {
uint output_image_index;
uint accumulation_image_index;
-};
-
-layout(push_constant) uniform registers {
- global_params globals;
- pass_params pass;
- draw_params draw;
} regs;
void main() {
- ivec2 coords = ivec2(gl_GlobalInvocationID.xy) * regs.globals.downscale_factor;
+ ivec2 coords = ivec2(gl_GlobalInvocationID.xy) * regs.downscale_factor;
- vec3 color = imageLoad(images[nonuniformEXT(regs.draw.accumulation_image_index)], coords).rgb;
+ vec3 color = imageLoad(images[nonuniformEXT(regs.accumulation_image_index)], coords).rgb;
vec3 out_color = sqrt(color);
- for (uint i = 0; i < regs.globals.downscale_factor; i++) {
- for (uint j = 0; j < regs.globals.downscale_factor; j++) {
- imageStore(images[nonuniformEXT(regs.draw.output_image_index)], coords + ivec2(i, j), vec4(out_color, 1.0));
+ for (uint i = 0; i < regs.downscale_factor; i++) {
+ for (uint j = 0; j < regs.downscale_factor; j++) {
+ imageStore(images[nonuniformEXT(regs.output_image_index)], coords + ivec2(i, j), vec4(out_color, 1.0));
}
}
}
diff --git a/shaders/transmittance_lut.comp b/shaders/transmittance_lut.comp index aadc55a..f932d69 100644 --- a/shaders/transmittance_lut.comp +++ b/shaders/transmittance_lut.comp @@ -1,11 +1,12 @@ #extension GL_EXT_buffer_reference : require #extension GL_EXT_nonuniform_qualifier : require +#extension GL_EXT_descriptor_heap : require layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; -layout(set = 0, binding = 0) uniform sampler samplers[]; -layout(set = 0, binding = 1) uniform texture2D textures[]; -layout(set = 0, binding = 2, rgba32f) uniform image2D images[]; +layout(descriptor_heap) uniform texture2D textures[]; +layout(descriptor_heap, rgba32f) uniform image2D images[]; +layout(descriptor_heap) uniform sampler samplers[]; layout(buffer_reference) readonly buffer draw_params { uint output_image_index; |
