#version 450 struct PointLight { vec3 color; float luminance; vec3 position; }; layout(binding = 0) uniform CameraUBO { mat4 projection; mat4 view; vec3 position; } camera; layout(push_constant) uniform ViewportConstants { vec4 viewport_size_tile_size; vec4 ambient_light; } viewport_constants; vec2 viewport_size = vec2(viewport_constants.x, viewport_constants.y); vec2 tile_size = vec2(viewport_constants.z, viewport_constants.w); layout(set = 2, binding = 0) uniform sampler2D depth_sampler; layout(set = 3, binding = 0) buffer PointLightSSBO { PointLight lights[1024]; }; layout(set = 3, binding = 1) buffer writeonly LightCullingData { uint visible_light_indices[]; uint total_visible_lights; }; struct Frustum { vec4 planes[6]; vec3 vertices[8]; }; struct NormalisedDeviceCoordinates { const vec2 top_left; const vec2 top_right; const vec2 bottom_left; const vec2 bottom_right; } ndc; Frustum Create() { //TODO: precalculate in CPU side mat4 projection_view = camera.projection* camera.view; mat4 inverse_pv = inverse(projection_view); vec2 tile_vertices[4]; tile_vertices } void main() { }