Files
2026-08-16 13:47:11 +01:00

74 lines
1.6 KiB
GLSL

#version 450
layout(triangles, invocations = 6) in;
layout(triangle_strip, max_vertices = 3) out;
struct PointShadowMapSet
{
uint entity_id;
uint shadow_id;
uint shadow_texture_id;
uint frame_buffer_id;
float near_plane;
float far_plane;
uint padding[2];
mat4 light_space_proj;
mat4 light_space_view[6];
};
//Push constants updated for each light
layout(binding = 0) uniform shadow_per_frame
{
vec3 camera_pos;
uint shadow_idxs;
};
layout (std430, binding = 7) readonly buffer point_shadow_map_sets
{
PointShadowMapSet point_shadows[];
};
layout (location=0) in VS_OUT
{
vec2 vsUV;
flat uint vsMaterialID;
}vs_in[];
layout (location=0) out GEOM_OUT
{
vec2 vsUV;
flat uint vsMaterialID;
vec4 frag_pos;
flat uint shad_idx;
flat vec3 light_pos;
}geom_out;
void main()
{
mat4 view = point_shadows[shadow_idxs].light_space_view[gl_InvocationID];
mat4 proj = point_shadows[shadow_idxs].light_space_proj;
mat3 rot_mat = mat3(view);
vec3 d = vec3(view[3]); // Column-major translation column
vec3 light_pos = -d * rot_mat;
for (int i = 0; i < 3; ++i)
{
geom_out.light_pos = light_pos;
geom_out.shad_idx = shadow_idxs;
geom_out.frag_pos = gl_in[i].gl_Position;
gl_Layer = gl_InvocationID;
vec4 clip_space_pos = proj * view * gl_in[i].gl_Position;
gl_Position = clip_space_pos;
geom_out.vsMaterialID = vs_in[gl_InvocationID].vsMaterialID;
geom_out.vsUV = vs_in[gl_InvocationID].vsUV;
EmitVertex();
}
EndPrimitive();
}