id_blit.slang

cross platform rendering playground

src/passes/id_blit/id_blit.slang

947 B
#include "shared.h"
#include "renderer_types.h"

[vk::push_constant]
IdBlitPushConstants pc;

struct VsOut {
    vec4 pos : SV_Position;
    u32 id;
}

[shader("vertex")]
VsOut vtx_main(u32 vertexID: SV_VertexID, u32 drawID: SV_DrawIndex, u32 instanceID: SV_InstanceID) {
    VsOut out;
    FrameUBO frame = *pc.frame;

    u32 item_idx = pc.visible_items[drawID].id;
    RenderItemGPU item = frame.render_items[item_idx];
    SubmeshGPU submesh = frame.submeshes[item.submesh_index];
    TransformGPU xform = frame.transforms[item.instance_id];
    Vertex v = pc.vertex[vertexID + submesh.base_vertex];

    out.pos = (vec4(v.pos, 1.0) * xform.world) * frame.view * frame.proj;
    out.id = item.entity_id;

    return out;
}

[shader("fragment")]
u32 fs_main(VsOut input) : SV_Target {
    f32 sd = pc.depth.Load(uvec3(u32(input.pos.x), u32(input.pos.y), 0)).r;
    if (input.pos.z < sd - 1e-4f) {
        discard;
    }
    return input.id;
};