127 lines
3.1 KiB
GLSL
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;
|
|
}
|