From 0ba85e3f08eb7de99a5b7b60293bcf23673e475e Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Fri, 3 Nov 2023 10:58:13 -0400 Subject: [PATCH] vk: add `rt_debug_display_only` cvar Displays only the specified channel. Fixes #631 --- ref/vk/TODO.md | 12 +++-- ref/vk/shaders/denoiser.comp | 97 +++++++++--------------------------- ref/vk/shaders/ray_interop.h | 11 +++- ref/vk/vk_rtx.c | 36 +++++++++++++ 4 files changed, 78 insertions(+), 78 deletions(-) diff --git a/ref/vk/TODO.md b/ref/vk/TODO.md index cd82891c..52bd6b56 100644 --- a/ref/vk/TODO.md +++ b/ref/vk/TODO.md @@ -1,12 +1,16 @@ +# 2023-11-03 E324 +- [x] add cvar for displaying only specified channel +- [ ] r_lightmap +- [ ] massage shaders: consolidate all bindings explicitly +- [ ] skip sorting-by-texture when loading brush models ~~(=> geometry count explosion; i.e. kusochki count will explode too)~~ +- [ ] kusochki-vs-materials structures +- [ ] -vkverbose arg for turning all debug logs before detailed cvars are read + # 2023-11-02 E323 - [x] lol meta: read and sort issues - [x] merge from upstream - [x] hevsuit glitches - [x] inverted normal map orientation -- [ ] massage shaders: consolidate all bindings explicitly -- [ ] skip sorting-by-texture when loading brush models (=> geometry count explosion; i.e. kusochki count will explode too) -- [ ] kusochki-vs-materials -- [ ] -vkverbose arg for turning all debug logs before detailed cvars are read # 2023-10-31 E322 - [x] load png blue noise files diff --git a/ref/vk/shaders/denoiser.comp b/ref/vk/shaders/denoiser.comp index f2c8ce9f..7983094e 100644 --- a/ref/vk/shaders/denoiser.comp +++ b/ref/vk/shaders/denoiser.comp @@ -43,17 +43,11 @@ layout(set = 0, binding = 18) uniform sampler3D blue_noise_texture; #endif //layout(set = 0, binding = 19) uniform sampler2D textures[MAX_TEXTURES]; +//layout(set = 0, binding = 18, rgba8) uniform readonly image2D material_rmxx; const int INDIRECT_SCALE = 2; -//#define DEBUG_TEXTURE normals_gs -//#define DEBUG_TEXTURE emissive -//#define DEBUG_TEXTURE base_color_a -//#define DEBUG_TEXTURE light_point_diffuse -//#define DEBUG_NORMAL -//layout(set = 0, binding = 18, rgba8) uniform readonly image2D material_rmxx; - // Blatantly copypasted from https://www.shadertoy.com/view/XsGfWV vec3 aces_tonemap(vec3 color){ mat3 m1 = mat3( @@ -121,10 +115,6 @@ Components blurSamples(const ivec2 res, const ivec2 pix) { continue; } - // const vec4 c = imageLoad(light_poly, p); - // if (c.a != material_index) - // continue; - vec3 sample_geometry_normal, sample_shading_normal; readNormals(p, sample_geometry_normal, sample_shading_normal); @@ -194,69 +184,34 @@ void main() { return; } + if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_DISABLED) { + // no-op, just continue + } else if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_BASECOLOR) { + imageStore(out_dest, pix, vec4(LINEARtoSRGB(imageLoad(base_color_a, pix).rgb), 0.)); return; + return; + } else if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_BASEALPHA) { + imageStore(out_dest, pix, imageLoad(base_color_a, pix).aaaa); return; + return; + } else if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_EMISSIVE) { + imageStore(out_dest, pix, vec4(LINEARtoSRGB(imageLoad(emissive, pix).rgb), 0.)); return; + return; + } else if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_NSHADE) { + vec3 geometry_normal, shading_normal; + readNormals(pix, geometry_normal, shading_normal); + imageStore(out_dest, pix, vec4(.5 + shading_normal * .5, 0.)); + return; + } else if (ubo.ubo.debug_display_only == DEBUG_DISPLAY_NGEOM) { + vec3 geometry_normal, shading_normal; + readNormals(pix, geometry_normal, shading_normal); + imageStore(out_dest, pix, vec4(.5 + geometry_normal * .5, 0.)); + return; + } + #ifdef DEBUG_NOISE imageStore(out_dest, pix, blueNoise(ivec3(pix.xy, ubo.ubo.frame_counter))); return; #endif - /* if (pix.y < res.y / 3) { */ - /* imageStore(out_dest, pix, vec4(pow(float(pix.x) / res.x, 2.2))); return; */ - /* } else if (pix.y < res.y * 2 / 3) { */ - /* imageStore(out_dest, pix, vec4(float(pix.x) / res.x)); return; */ - /* } else { */ - /* imageStore(out_dest, pix, vec4(sqrt(float(pix.x) / res.x))); return; */ - /* } */ - -#if defined(DEBUG_TEXTURE) - //if (pix.x < res.x / 2) { - //imageStore(out_dest, pix, vec4(LINEARtoSRGB(texture(textures[161], vec2(pix)/vec2(res)).rgb), 0.)); return; - //} - imageStore(out_dest, pix, vec4(LINEARtoSRGB(imageLoad(DEBUG_TEXTURE, pix).rgb), 0.)); return; -#endif - - /* - if (pix.x < res.x / 4) { - imageStore(out_dest, pix, vec4(imageLoad(base_color_a, pix).rgb, 0.)); return; - } else if (pix.x < res.x / 2) { - imageStore(out_dest, pix, vec4(LINEARtoSRGB(imageLoad(emissive, pix).rgb), 0.)); return; - } else if (pix.x < res.x * 3 / 4) { - imageStore(out_dest, pix, vec4(LINEARtoSRGB(fract( - imageLoad(light_poly_diffuse, pix).rgb - + imageLoad(light_poly_specular, pix).rgb - + imageLoad(light_point_diffuse, pix).rgb - + imageLoad(light_point_specular, pix).rgb - )), 0.)); return; - } else { - imageStore(out_dest, pix, vec4(LINEARtoSRGB( - imageLoad(indirect_diffuse, pix / INDIRECT_SCALE).rgb - + imageLoad(indirect_specular, pix / INDIRECT_SCALE).rgb - ), 0.)); return; - }*/ - - //imageStore(out_dest, pix, vec4(fract(imageLoad(position_t, pix).rgb/10.), 0.)); return; - //imageStore(out_dest, pix, vec4(fract(imageLoad(geometry_prev_position, pix).rgb/50.), 0.)); return; - -#if defined(DEBUG_NORMAL) - vec3 geometry_normal, shading_normal; - readNormals(pix, geometry_normal, shading_normal); - //imageStore(out_dest, pix, vec4(.5 + geometry_normal * .5, 0.)); return; - //const vec4 mat_rmxx = imageLoad(material_rmxx, pix); - //imageStore(out_dest, pix, vec4((.5 + shading_normal * .5)*.8 + .2 * mat_rmxx.a , 0.)); return; - //imageStore(out_dest, pix, vec4(.5 + shading_normal * .5, 0.)); return; - - //vec3 normal = pix.x < res.x / 2 ? shading_normal : geometry_normal; - vec3 normal = shading_normal;// : geometry_normal; - imageStore(out_dest, pix, vec4(.5 + normal * .5, 0.)); return; -#endif - - /* const uint mi = uint(material_index); */ - /* imageStore(out_dest, pix, vec4(rand3_f01(uvec3(mi,mi+1,mi+2)), 0.)); */ - /* return; */ - const Components c = blurSamples(res, pix); - //imageStore(out_dest, pix, vec4(aces_tonemap(c.direct_diffuse), 0.)); return; - //imageStore(out_dest, pix, vec4(aces_tonemap(c.direct_specular), 0.)); return; - //imageStore(out_dest, pix, vec4(aces_tonemap(c.indirect_diffuse), 0.)); return; - //imageStore(out_dest, pix, vec4(aces_tonemap(c.indirect_specular), 0.)); return; vec3 colour = vec3(0.); { @@ -304,10 +259,6 @@ void main() { imageStore(out_temporal_diffuse, pix, vec4(diffuse, depth)); imageStore(out_temporal_specular, pix, vec4(specular, 0./*unused*/)); colour = diffuse + specular; - - //imageStore(out_dest, pix, vec4(LINEARtoSRGB(diffuse), 0.)); return; - //imageStore(out_dest, pix, vec4(fract(abs(position - prev_position)), 0./*unused*/)); return; - //imageStore(out_dest, pix, vec4(fract(abs(prev_position)), 0./*unused*/)); return; } const vec4 base_color_a = SRGBtoLINEAR(imageLoad(base_color_a, pix)); diff --git a/ref/vk/shaders/ray_interop.h b/ref/vk/shaders/ray_interop.h index 1363bb10..c60a63b1 100644 --- a/ref/vk/shaders/ray_interop.h +++ b/ref/vk/shaders/ray_interop.h @@ -168,13 +168,22 @@ struct PushConstants { uint flags; }; +#define DEBUG_DISPLAY_DISABLED 0 +#define DEBUG_DISPLAY_BASECOLOR 1 +#define DEBUG_DISPLAY_BASEALPHA 2 +#define DEBUG_DISPLAY_EMISSIVE 3 +#define DEBUG_DISPLAY_NSHADE 4 +#define DEBUG_DISPLAY_NGEOM 5 +// add more when needed + struct UniformBuffer { mat4 inv_proj, inv_view; mat4 prev_inv_proj, prev_inv_view; float ray_cone_width; uint random_seed; uint frame_counter; - PAD(1) + + uint debug_display_only; }; #undef PAD diff --git a/ref/vk/vk_rtx.c b/ref/vk/vk_rtx.c index 7b486121..60ac3ed7 100644 --- a/ref/vk/vk_rtx.c +++ b/ref/vk/vk_rtx.c @@ -89,6 +89,11 @@ static struct { qboolean reload_pipeline; matrix4x4 prev_inv_proj, prev_inv_view; + + struct { + cvar_t *rt_debug_display_only; + uint32_t rt_debug_display_only_value; + } debug; } g_rtx = {0}; static int findResource(const char *name) { @@ -145,6 +150,32 @@ void VK_RayFrameBegin( void ) { RT_LightsFrameBegin(); } +static void parseDebugDisplayValue( void ) { + if (!(g_rtx.debug.rt_debug_display_only->flags & FCVAR_CHANGED)) + return; + + g_rtx.debug.rt_debug_display_only->flags &= ~FCVAR_CHANGED; + + const char *cvalue = g_rtx.debug.rt_debug_display_only->string; +#define LIST_DISPLAYS(X) \ + X(BASECOLOR) \ + X(BASEALPHA) \ + X(EMISSIVE) \ + X(NSHADE) \ + X(NGEOM) \ + +#define X(suffix) \ + if (0 == Q_stricmp(cvalue, #suffix)) { \ + WARN("setting debug display to %s", "DEBUG_DISPLAY_"#suffix); \ + g_rtx.debug.rt_debug_display_only_value = DEBUG_DISPLAY_##suffix; \ + return; \ + } +LIST_DISPLAYS(X) +#undef X + + g_rtx.debug.rt_debug_display_only_value = DEBUG_DISPLAY_DISABLED; +} + static void prepareUniformBuffer( const vk_ray_frame_render_args_t *args, int frame_index, uint32_t frame_counter, float fov_angle_y ) { struct UniformBuffer *ubo = (struct UniformBuffer*)((char*)g_rtx.uniform_buffer.mapped + frame_index * g_rtx.uniform_unit_size); @@ -166,6 +197,9 @@ static void prepareUniformBuffer( const vk_ray_frame_render_args_t *args, int fr ubo->ray_cone_width = atanf((2.0f*tanf(DEG2RAD(fov_angle_y) * 0.5f)) / (float)FRAME_HEIGHT); ubo->random_seed = (uint32_t)gEngine.COM_RandomLong(0, INT32_MAX); ubo->frame_counter = frame_counter; + + parseDebugDisplayValue(); + ubo->debug_display_only = g_rtx.debug.rt_debug_display_only_value; } typedef struct { @@ -657,6 +691,8 @@ qboolean VK_RayInit( void ) gEngine.Cmd_AddCommand("vk_rtx_reload", reloadPipeline, "Reload RTX shader"); + g_rtx.debug.rt_debug_display_only = gEngine.Cvar_Get("rt_debug_display_only", "", FCVAR_GLCONFIG, "Display only the specified channel (nshade, ngeom, basecolor, basealpha, ...)"); + return true; }