shadow.slang

cross platform rendering playground

src/passes/shadow/shadow.slang

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

[[vk::push_constant]]
ShadowPushConstants pc;

[shader("vertex")]
VtxOut vsMain(u32 vertexID: SV_VertexID, u32 drawID: SV_DrawIndex, u32 instanceID: SV_InstanceID) {
    VtxOut o;

    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];
    vec4 worldPos = vec4(v.pos, 1.0) * xform.world;

    // CSM matrices are built in render-relative space. frame.position_ws.xyz is
    // currently the render origin. (light.h)
    vec3 shadowPos = worldPos.xyz - frame.position_ws.xyz;

    mat4 light_vp = frame.shadows.cascade[pc.cascade_idx].view_proj;
    o.clip_pos = vec4(shadowPos, 1.0) * light_vp;

    return o;
}

[shader("fragment")]
f32 fsMain(VtxOut input) : SV_Depth {
    return input.clip_pos.z;
}