#version 450 layout(triangles, invocations = 6) in; layout(triangle_strip, max_vertices = 3) out; struct DirectionalShadowMapSet { uint entity_id; uint shadow_id; uint shadow_texture_id; uint frame_buffer_id; float near_plane[8]; float far_plane[8]; mat4 light_space_proj[6]; 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 = 5) readonly buffer directional_shadow_map_sets { DirectionalShadowMapSet directional_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; }geom_out; void main() { mat4 view = directional_shadows[shadow_idxs].light_space_view[gl_InvocationID]; mat4 proj = directional_shadows[shadow_idxs].light_space_proj[gl_InvocationID]; for (int i = 0; i < 3; ++i) { 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(); }