#include "sh/common.hlsl" /* ========================== * * Root signature * ========================== */ #define ROOTSIG \ "RootConstants(num32BitConstants = 6, b0), " \ "DescriptorTable(SRV(t0, space = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE)), " \ "DescriptorTable(SRV(t0, space = 1, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE)), " \ "DescriptorTable(UAV(u0, space = 2, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE)), " \ \ \ "StaticSampler(s0, " \ "filter = FILTER_MIN_MAG_MIP_POINT, " \ "addressU = TEXTURE_ADDRESS_CLAMP, " \ "addressV = TEXTURE_ADDRESS_CLAMP, " \ "addressW = TEXTURE_ADDRESS_CLAMP, " \ "maxAnisotropy = 1)" ConstantBuffer g_constants : register(b0); Texture2D g_gbuff_textures[] : register(t0, space0); Texture2D g_emittance_flood_textures[] : register(t0, space1); RWTexture2D g_write_textures[]: register(u0, space2); SamplerState g_sampler : register(s0); /* ========================== * * Compute shader * ========================== */ struct cs_input { DECLS(uint3, SV_DispatchThreadID); }; [numthreads(8, 8, 1)] SH_ENTRY(ROOTSIG) void cs(struct cs_input input) { uint2 id = input.SV_DispatchThreadID.xy; if (id.x >= g_constants.tex_width || id.y >= g_constants.tex_height) { return; /* Overflow */ } float4 old_color = g_gbuff_textures[g_constants.write_tex_urid][id]; float4 albedo = g_gbuff_textures[g_constants.albedo_tex_urid][id]; float4 emittance = g_gbuff_textures[g_constants.emittance_tex_urid][id]; int2 emittance_flood = g_emittance_flood_textures[g_constants.emittance_flood_tex_urid][id]; emittance_flood *= (emittance_flood.x >= 0 && emittance_flood.y >= 0); float4 final_color = old_color + albedo + float4(float(emittance_flood.x) / float(g_constants.tex_width), float(emittance_flood.y) / float(g_constants.tex_height), 0, 1); g_write_textures[g_constants.write_tex_urid][id] = final_color; }