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

85 lines
1.7 KiB
GLSL

//*PIXEL*
#version 460
#extension GL_ARB_bindless_texture : require
const uint DIRECTIONAL_LIGHT = 1;
const uint POINT_LIGHT = 2;
const uint SPOT_LIGHT = 3;
uint INVALID_HYDRA_ID = 4294967295;
struct MaterialStore
{
vec4 diffuse_colour;
vec4 matalic_rough;
uint diffuse_texture_id;
uint metallic_rough_texture_id;
uint normal_texture_id;
uint padding[1];
};
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];
};
layout(std430, binding = 2) readonly buffer material_buffer
{
MaterialStore materials[1000];
};
layout(std430, binding = 3) readonly buffer texture_buffer
{
uvec2 textures[1000];
};
layout (std430, binding = 7) readonly buffer point_shadow_map_sets
{
PointShadowMapSet point_shadows[];
};
layout (location=0) in GEOM_OUT
{
vec2 vsUV;
flat uint vsMaterialID;
vec4 frag_pos;
flat uint shad_idx;
flat vec3 light_pos;
}geom_out;
layout (location=0) out vec4 output_colour;
void main()
{
MaterialStore mat = materials[geom_out.vsMaterialID];
vec4 diffuse_val = mat.diffuse_colour;
if(mat.diffuse_texture_id != INVALID_HYDRA_ID)
{
uvec2 diffuse_handle = textures[mat.diffuse_texture_id];
diffuse_val = diffuse_val * texture(sampler2D(diffuse_handle), geom_out.vsUV.xy);
}
if(diffuse_val[3] < 1.0)
{
discard;
}
float light_distance = length(geom_out.frag_pos.xyz - geom_out.light_pos);
// map to [0;1] range by dividing by far_plane
light_distance = light_distance / point_shadows[geom_out.shad_idx].far_plane;
// write this as modified depth
gl_FragDepth = light_distance;
}