From a152fb8ac1a64e53ebcb890eb86589ca580f7174 Mon Sep 17 00:00:00 2001 From: Ivan 'provod' Avdeev Date: Tue, 9 Nov 2021 10:59:36 -0800 Subject: [PATCH] rtx: add specular and additive channels --- ref_vk/shaders/denoiser.comp | 16 +++- ref_vk/shaders/ray.rgen | 8 +- ref_vk/vk_denoiser.c | 36 ++++++++- ref_vk/vk_denoiser.h | 2 + ref_vk/vk_rtx.c | 145 +++++++++++++++++++---------------- 5 files changed, 134 insertions(+), 73 deletions(-) diff --git a/ref_vk/shaders/denoiser.comp b/ref_vk/shaders/denoiser.comp index df971ae8..f7446a3d 100644 --- a/ref_vk/shaders/denoiser.comp +++ b/ref_vk/shaders/denoiser.comp @@ -4,9 +4,12 @@ layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in; -layout(set = 0, binding = 0, rgba8) uniform image2D src_base_color; -layout(set = 0, binding = 1, rgba16f) uniform image2D src_diffuse_gi; -layout(set = 0, binding = 2, rgba16f) uniform image2D dest; +layout(set = 0, binding = 0, rgba16f) uniform image2D dest; + +layout(set = 0, binding = 1, rgba8) uniform image2D src_base_color; +layout(set = 0, binding = 2, rgba16f) uniform image2D src_diffuse_gi; +layout(set = 0, binding = 3, rgba16f) uniform image2D src_specular; +layout(set = 0, binding = 4, rgba16f) uniform image2D src_additive; // Blatantly copypasted from https://www.shadertoy.com/view/XsGfWV vec3 aces_tonemap(vec3 color){ @@ -41,6 +44,7 @@ void main() { //imageStore(dest, pix, vec4(aces_tonemap(base_color.rgb), 0.)); return; //imageStore(dest, pix, vec4(aces_tonemap(imageLoad(src_diffuse_gi, pix).rgb), 0.)); return; + //imageStore(dest, pix, vec4(aces_tonemap(imageLoad(src_specular, pix).rgb), 0.)); return; // const uint mi = uint(material_index); // imageStore(dest, pix, vec4(rand3_f01(uvec3(mi,mi+1,mi+2)), 0.)); @@ -65,9 +69,13 @@ void main() { if (scale > 0.) { colour /= scale; colour *= base_color.rgb; - colour = aces_tonemap(colour); } + colour += imageLoad(src_specular, pix).rgb; + colour += imageLoad(src_additive, pix).rgb; + + colour = aces_tonemap(colour); + imageStore(dest, pix, vec4(colour, 0.)); //imageStore(dest, pix, imageLoad(src_diffuse_gi, pix)); } diff --git a/ref_vk/shaders/ray.rgen b/ref_vk/shaders/ray.rgen index 449f423b..2c41c1bb 100644 --- a/ref_vk/shaders/ray.rgen +++ b/ref_vk/shaders/ray.rgen @@ -24,6 +24,8 @@ layout (constant_id = 5) const uint MAX_LIGHT_CLUSTERS = 32768; layout(set = 0, binding = 0, rgba8) uniform image2D out_image_base_color; layout(set = 0, binding = 9, rgba16f) uniform image2D out_image_diffuse_gi; +layout(set = 0, binding = 10, rgba16f) uniform image2D out_image_specular; +layout(set = 0, binding = 11, rgba16f) uniform image2D out_image_additive; layout(set = 0, binding = 1) uniform accelerationStructureEXT tlas; layout(set = 0, binding = 2) uniform UBO { @@ -338,7 +340,7 @@ void main() { payload_opaque.pixel_cone_spread_angle = push_constants.pixel_cone_spread_angle; float out_material_index = 0.; - vec3 out_emissive = vec3(0.); + vec3 out_additive = vec3(0.); vec3 out_diffuse_gi = vec3(0.); vec3 out_specular = vec3(0.); @@ -405,7 +407,7 @@ void main() { material.roughness = payload_opaque.roughness; if (bounce == 0) { //brdfType == SPECULAR_TYPE) - out_emissive = payload_opaque.emissive + additive; + out_additive = payload_opaque.emissive + additive; additive = vec3(0.); out_material_index = float(payload_opaque.material_index); @@ -489,4 +491,6 @@ void main() { } imageStore(out_image_diffuse_gi, ivec2(gl_LaunchIDEXT.xy), vec4(out_diffuse_gi / color_factor, out_material_index)); + imageStore(out_image_specular, ivec2(gl_LaunchIDEXT.xy), vec4(out_specular / color_factor, 0.)); + imageStore(out_image_additive, ivec2(gl_LaunchIDEXT.xy), vec4(out_additive / color_factor, 0.)); } diff --git a/ref_vk/vk_denoiser.c b/ref_vk/vk_denoiser.c index 471a56d5..9f687b67 100644 --- a/ref_vk/vk_denoiser.c +++ b/ref_vk/vk_denoiser.c @@ -6,9 +6,12 @@ #include "eiface.h" // ARRAYSIZE enum { - DenoiserBinding_Source_BaseColor = 0, - DenoiserBinding_Source_DiffuseGI = 1, - DenoiserBinding_DestImage = 2, + DenoiserBinding_DestImage = 0, + + DenoiserBinding_Source_BaseColor = 1, + DenoiserBinding_Source_DiffuseGI = 2, + DenoiserBinding_Source_Specular = 3, + DenoiserBinding_Source_Additive = 4, DenoiserBinding_COUNT }; @@ -56,6 +59,20 @@ static void createLayouts( void ) { .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, }; + g_denoiser.desc_bindings[DenoiserBinding_Source_Specular] = (VkDescriptorSetLayoutBinding){ + .binding = DenoiserBinding_Source_Specular, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + }; + + g_denoiser.desc_bindings[DenoiserBinding_Source_Additive] = (VkDescriptorSetLayoutBinding){ + .binding = DenoiserBinding_Source_Additive, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + }; + VK_DescriptorsCreate(&g_denoiser.descriptors); } @@ -110,6 +127,19 @@ void XVK_DenoiserDenoise( const xvk_denoiser_args_t* args ) { .imageLayout = VK_IMAGE_LAYOUT_GENERAL, }; + g_denoiser.desc_values[DenoiserBinding_Source_Specular].image = (VkDescriptorImageInfo){ + .sampler = VK_NULL_HANDLE, + .imageView = args->src.specular_view, + .imageLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + + g_denoiser.desc_values[DenoiserBinding_Source_Additive].image = (VkDescriptorImageInfo){ + .sampler = VK_NULL_HANDLE, + .imageView = args->src.additive_view, + .imageLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + + g_denoiser.desc_values[DenoiserBinding_DestImage].image = (VkDescriptorImageInfo){ .sampler = VK_NULL_HANDLE, .imageView = args->dst_view, diff --git a/ref_vk/vk_denoiser.h b/ref_vk/vk_denoiser.h index 0a01df58..73415c21 100644 --- a/ref_vk/vk_denoiser.h +++ b/ref_vk/vk_denoiser.h @@ -14,6 +14,8 @@ typedef struct { struct { VkImageView base_color_view; VkImageView diffuse_gi_view; + VkImageView specular_view; + VkImageView additive_view; } src; VkImageView dst_view; diff --git a/ref_vk/vk_rtx.c b/ref_vk/vk_rtx.c index 264edcfc..b17ef357 100644 --- a/ref_vk/vk_rtx.c +++ b/ref_vk/vk_rtx.c @@ -72,8 +72,9 @@ enum { RayDescBinding_LightClusters = 8, RayDescBinding_Dest_ImageDiffuseGI = 9, - //RayDescBinding_Dest_ImageNormal = 10, - //RayDescBinding_Dest_ImageSpecular = 11, + RayDescBinding_Dest_ImageSpecular = 10, + RayDescBinding_Dest_ImageAdditive = 11, + //RayDescBinding_Dest_ImageNormal = 12, RayDescBinding_COUNT }; @@ -82,6 +83,8 @@ typedef struct { vk_image_t denoised; vk_image_t base_color; vk_image_t diffuse_gi; + vk_image_t specular; + vk_image_t additive; } xvk_ray_frame_images_t; static struct { @@ -637,11 +640,27 @@ static void updateDescriptors( VkCommandBuffer cmdbuf, const vk_ray_frame_render .imageLayout = VK_IMAGE_LAYOUT_GENERAL, }; + g_rtx.desc_values[RayDescBinding_Dest_ImageSpecular].image = (VkDescriptorImageInfo){ + .sampler = VK_NULL_HANDLE, + .imageView = frame_dst->specular.view, + .imageLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + + g_rtx.desc_values[RayDescBinding_Dest_ImageAdditive].image = (VkDescriptorImageInfo){ + .sampler = VK_NULL_HANDLE, + .imageView = frame_dst->additive.view, + .imageLayout = VK_IMAGE_LAYOUT_GENERAL, + }; VK_DescriptorsWrite(&g_rtx.descriptors); } -static qboolean rayTrace( VkCommandBuffer cmdbuf, const xvk_ray_frame_images_t *current_frame, float fov_angle_y ) -{ +static qboolean rayTrace( VkCommandBuffer cmdbuf, const xvk_ray_frame_images_t *current_frame, float fov_angle_y ) { +#define LIST_GBUFFER_IMAGES(X) \ + X(base_color) \ + X(diffuse_gi) \ + X(specular) \ + X(additive) \ + // 4. Barrier for TLAS build and dest image layout transfer { VkBufferMemoryBarrier bmb[] = { { @@ -652,35 +671,24 @@ static qboolean rayTrace( VkCommandBuffer cmdbuf, const xvk_ray_frame_images_t * .offset = 0, .size = VK_WHOLE_SIZE, } }; - VkImageMemoryBarrier image_barrier[] = { { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .image = current_frame->base_color.image, - .srcAccessMask = 0, - .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT, - .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresourceRange = (VkImageSubresourceRange) { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }, { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .image = current_frame->diffuse_gi.image, - .srcAccessMask = 0, - .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT, - .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresourceRange = (VkImageSubresourceRange) { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - } }; + VkImageMemoryBarrier image_barrier[] = { +#define GBUFFER_WRITE_BARRIER(img) { \ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, \ + .image = current_frame->img.image, \ + .srcAccessMask = 0, \ + .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT, \ + .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, \ + .newLayout = VK_IMAGE_LAYOUT_GENERAL, \ + .subresourceRange = (VkImageSubresourceRange) { \ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, \ + .baseMipLevel = 0, \ + .levelCount = 1, \ + .baseArrayLayer = 0, \ + .layerCount = 1, \ + }, \ + }, +LIST_GBUFFER_IMAGES(GBUFFER_WRITE_BARRIER) + }; vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, @@ -952,37 +960,24 @@ void VK_RayFrameEnd(const vk_ray_frame_render_args_t* args) rayTrace(cmdbuf, current_frame, args->fov_angle_y); { - const VkImageMemoryBarrier image_barriers[] = { { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .image = current_frame->base_color.image, - .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, - .oldLayout = VK_IMAGE_LAYOUT_GENERAL, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresourceRange = - (VkImageSubresourceRange){ - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }, { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .image = current_frame->diffuse_gi.image, - .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, - .oldLayout = VK_IMAGE_LAYOUT_GENERAL, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresourceRange = - (VkImageSubresourceRange){ - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - }, { + const VkImageMemoryBarrier image_barriers[] = { +#define GBUFFER_READ_BARRIER(img) { \ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, \ + .image = current_frame->img.image, \ + .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, \ + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, \ + .oldLayout = VK_IMAGE_LAYOUT_GENERAL, \ + .newLayout = VK_IMAGE_LAYOUT_GENERAL, \ + .subresourceRange = (VkImageSubresourceRange) { \ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, \ + .baseMipLevel = 0, \ + .levelCount = 1, \ + .baseArrayLayer = 0, \ + .layerCount = 1, \ + }, \ + }, +LIST_GBUFFER_IMAGES(GBUFFER_READ_BARRIER) + { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .image = current_frame->denoised.image, .srcAccessMask = 0, @@ -1012,6 +1007,8 @@ void VK_RayFrameEnd(const vk_ray_frame_render_args_t* args) .src = { .base_color_view = current_frame->base_color.view, .diffuse_gi_view = current_frame->diffuse_gi.view, + .specular_view = current_frame->specular.view, + .additive_view = current_frame->additive.view, }, .dst_view = current_frame->denoised.view, }; @@ -1064,6 +1061,18 @@ static void createLayouts( void ) { .descriptorCount = 1, .stageFlags = VK_SHADER_STAGE_RAYGEN_BIT_KHR, }; + g_rtx.desc_bindings[RayDescBinding_Dest_ImageAdditive] = (VkDescriptorSetLayoutBinding){ + .binding = RayDescBinding_Dest_ImageAdditive, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_RAYGEN_BIT_KHR, + }; + g_rtx.desc_bindings[RayDescBinding_Dest_ImageSpecular] = (VkDescriptorSetLayoutBinding){ + .binding = RayDescBinding_Dest_ImageSpecular, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_RAYGEN_BIT_KHR, + }; g_rtx.desc_bindings[RayDescBinding_Dest_ImageBaseColor] = (VkDescriptorSetLayoutBinding){ .binding = RayDescBinding_Dest_ImageBaseColor, @@ -1227,6 +1236,14 @@ qboolean VK_RayInit( void ) g_rtx.frames[i].diffuse_gi = VK_ImageCreate(FRAME_WIDTH, FRAME_HEIGHT, VK_FORMAT_R16G16B16A16_SFLOAT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT); SET_DEBUG_NAMEF(g_rtx.frames[i].diffuse_gi.image, VK_OBJECT_TYPE_IMAGE, "rtx frames[%d] diffuse_gi", i); + + g_rtx.frames[i].specular = VK_ImageCreate(FRAME_WIDTH, FRAME_HEIGHT, VK_FORMAT_R16G16B16A16_SFLOAT, + VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT); + SET_DEBUG_NAMEF(g_rtx.frames[i].specular.image, VK_OBJECT_TYPE_IMAGE, "rtx frames[%d] specular", i); + + g_rtx.frames[i].additive = VK_ImageCreate(FRAME_WIDTH, FRAME_HEIGHT, VK_FORMAT_R16G16B16A16_SFLOAT, + VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT); + SET_DEBUG_NAMEF(g_rtx.frames[i].additive.image, VK_OBJECT_TYPE_IMAGE, "rtx frames[%d] additive", i); } if (vk_core.debug) {