60 lines
1.8 KiB
GLSL
60 lines
1.8 KiB
GLSL
#include "utils/camera.glsl"
|
|
#include "utils/global_light_data.glsl"
|
|
#include "utils/spm_data.glsl"
|
|
#include "../utils/get_world_location.vert"
|
|
|
|
layout(push_constant) uniform Constants
|
|
{
|
|
vec4 m_billboard_rotation;
|
|
int m_fullscreen_light;
|
|
} u_push_constants;
|
|
|
|
layout(location = 0) flat out int light_idx;
|
|
|
|
const vec3 g_vertices[4] =
|
|
vec3[]
|
|
(
|
|
vec3( 1.0, 1.0, 0.0),
|
|
vec3( 1.0, -1.0, 0.0),
|
|
vec3(-1.0, 1.0, 0.0),
|
|
vec3(-1.0, -1.0, 0.0)
|
|
);
|
|
|
|
void main()
|
|
{
|
|
// Get the light index from the instance ID
|
|
light_idx = gl_InstanceIndex + u_push_constants.m_fullscreen_light;
|
|
LightData light = u_global_light.m_lights[light_idx];
|
|
vec4 pos_radius = light.m_position_radius;
|
|
|
|
// Get camera position from inverse view matrix
|
|
vec3 camera_pos = vec3(u_camera.m_inverse_view_matrix[3]);
|
|
|
|
// Calculate vector from light to camera
|
|
vec3 light_to_camera = normalize(camera_pos - pos_radius.xyz);
|
|
|
|
/* The lights which cover the whole screen have been rendered already
|
|
// Calculate distance from light to camera
|
|
float dist_to_camera = distance(camera_pos, pos_radius.xyz);
|
|
|
|
// If camera is within light radius, move the billboard quad towards the
|
|
// near plane
|
|
if (dist_to_camera < pos_radius.w)
|
|
{
|
|
gl_Position = vec4(g_vertices[gl_VertexIndex], 1.0);
|
|
return;
|
|
}
|
|
*/
|
|
|
|
// Move the billboard towards camera by one radius unit
|
|
vec4 world_pos = getWorldPosition(
|
|
pos_radius.xyz + light_to_camera * pos_radius.w,
|
|
u_push_constants.m_billboard_rotation,
|
|
vec3(pos_radius.w), g_vertices[gl_VertexIndex]);
|
|
vec4 pv = u_camera.m_projection_view_matrix * world_pos;
|
|
if (pv.z < 0.0)
|
|
gl_Position = vec4(pv.xy, 0.0, 1.0);
|
|
else
|
|
gl_Position = pv;
|
|
}
|