blade-render 0.5.0

Renderer built on Blade
Documentation
#include "debug.inc.wgsl"
#include "debug-param.inc.wgsl"

struct ToneMapParams {
    enabled: u32,
    average_lum: f32,
    key_value: f32,
    // minimum value of the pixels mapped to white brightness
    white_level: f32,
}

var t_albedo: texture_2d<f32>;
var light_diffuse: texture_2d<f32>;
var t_debug: texture_2d<f32>;
var<uniform> tone_map_params: ToneMapParams;
var<uniform> debug_params: DebugParams;

struct VertexOutput {
    @builtin(position) clip_pos: vec4<f32>,
    @location(0) @interpolate(flat) input_size: vec2<u32>,
}

@vertex
fn postfx_vs(@builtin(vertex_index) vi: u32) -> VertexOutput {
    var vo: VertexOutput;
    vo.clip_pos = vec4<f32>(f32(vi & 1u) * 4.0 - 1.0, f32(vi & 2u) * 2.0 - 1.0, 0.0, 1.0);
    vo.input_size = textureDimensions(light_diffuse, 0);
    return vo;
}

@fragment
fn postfx_fs(vo: VertexOutput) -> @location(0) vec4<f32> {
    let tc = vec2<i32>(i32(vo.clip_pos.x), i32(vo.clip_pos.y));
    let illumunation = textureLoad(light_diffuse, tc, 0);
    if (debug_params.view_mode == DebugMode_Final) {
        let albedo = textureLoad(t_albedo, tc, 0).xyz;
        let color = albedo.xyz * illumunation.xyz;
        if (tone_map_params.enabled != 0u) {
            // Following https://blog.en.uwa4d.com/2022/07/19/physically-based-renderingg-hdr-tone-mapping/
            let l_adjusted = tone_map_params.key_value / tone_map_params.average_lum * color;
            let l_white = tone_map_params.white_level;
            let l_ldr = l_adjusted * (1.0 + l_adjusted / (l_white*l_white)) / (1.0 + l_adjusted);
            return vec4<f32>(l_ldr, 1.0);
        } else {
            return vec4<f32>(color, 1.0);
        }
    } else if (debug_params.view_mode == DebugMode_Variance) {
        return vec4<f32>(illumunation.w);
    } else {
        return textureLoad(t_debug, tc, 0);
    }
}