MetaCoreEngineV2/rpcore/shader/includes/light_data.inc.glsl
2026-01-13 17:06:06 +08:00

127 lines
3.1 KiB
GLSL

#pragma once
#pragma include "includes/light_data.struct.glsl"
#pragma include "includes/source_data.struct.glsl"
/*
Description of the packing and the layout can be found here:
https://github.com/tobspr/RenderPipeline/wiki/LightStorage
*/
// Reads the light data from a given buffer and offset
LightData read_light_data(samplerBuffer LightDataBuffer, int offset) {
LightData data;
data.Data0 = texelFetch(LightDataBuffer, offset * 4 + 0);
data.Data1 = texelFetch(LightDataBuffer, offset * 4 + 1);
data.Data2 = texelFetch(LightDataBuffer, offset * 4 + 2);
data.Data3 = texelFetch(LightDataBuffer, offset * 4 + 3);
return data;
}
// Only reads the light type, in case nothing else is required
int read_light_type(samplerBuffer LightDataBuffer, int offset) {
float data0x = texelFetch(LightDataBuffer, offset * 4 + 0).x;
return gpu_cq_unpack_int_from_float(data0x);
}
bool read_casts_shadows(samplerBuffer LightDataBuffer, int offset) {
float data0z = texelFetch(LightDataBuffer, offset * 4 + 0).z;
return gpu_cq_unpack_int_from_float(data0z) >= 0;
}
// Extracts the type of a light
int get_light_type(LightData data) {
return gpu_cq_unpack_int_from_float(data.Data0.x);
}
// Extracts the ies profile index of a light
int get_ies_profile(LightData data) {
return gpu_cq_unpack_int_from_float(data.Data0.y);
}
int get_shadow_source_index(LightData data) {
return gpu_cq_unpack_int_from_float(data.Data0.z);
}
bool get_casts_shadows(LightData data) {
return get_shadow_source_index(data) >= 0;
}
// Extracts the light world space position
vec3 get_light_position(LightData data) {
return vec3(data.Data0.w, data.Data1.xy);
}
// Extracts the light color
vec3 get_light_color(LightData data) {
return vec3(data.Data1.zw, data.Data2.x) * 100.0;
}
/*
Point Light Dataset
*/
// Extracts the radius of a point light
float get_pointlight_radius(LightData data) {
return data.Data2.y;
}
// Extracts the inner radius of a point light
float get_pointlight_inner_radius(LightData data) {
return data.Data2.z;
}
/*
Spot Light Dataset
*/
// Extracts the radius of a spot light
float get_spotlight_radius(LightData data) {
return data.Data2.y;
}
// Extracts the fov of a spot light
float get_spotlight_fov(LightData data) {
return data.Data2.z;
}
// Extracts the direction of a spot light
vec3 get_spotlight_direction(LightData data) {
return vec3(data.Data2.w, data.Data3.xy);
}
/*
Shadow sources
*/
// Reads the shadow source data from a given buffer and offset
SourceData read_source_data(samplerBuffer SourceDataBuffer, int offset) {
SourceData data;
data.Data0 = texelFetch(SourceDataBuffer, offset + 0);
data.Data1 = texelFetch(SourceDataBuffer, offset + 1);
data.Data2 = texelFetch(SourceDataBuffer, offset + 2);
data.Data3 = texelFetch(SourceDataBuffer, offset + 3);
data.Data4 = texelFetch(SourceDataBuffer, offset + 4);
return data;
}
mat4 get_source_mvp(SourceData data) {
return mat4(data.Data0, data.Data1, data.Data2, data.Data3);
}
vec4 get_source_uv(SourceData data) {
return data.Data4;
}