X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=shaderlib%2Fshadow.glsl;h=52cd7c13ab767a4cb07b24e11b4be7bb1c898df4;hb=ab23d3910ac081066b42c184c6229aaa397dd46c;hp=04cf6832dcffd19a6a4949c1049b98e0f2b64a40;hpb=82282de52e8e8f3bbafefaf92bf76f53f2c2495e;p=libs%2Fgl.git diff --git a/shaderlib/shadow.glsl b/shaderlib/shadow.glsl index 04cf6832..52cd7c13 100644 --- a/shaderlib/shadow.glsl +++ b/shaderlib/shadow.glsl @@ -1,30 +1,37 @@ import msp_interface; -uniform ShadowMap +struct ShadowParameters { - float shadow_darkness; + int enabled; + float darkness; mat4 shd_world_matrix; + vec4 region; +}; + +uniform ShadowMap +{ + ShadowParameters shadows[max_lights]; }; uniform sampler2DShadow shadow_map; layout(constant_id=auto) const bool use_shadow_map = false; -#pragma MSP stage(vertex) -void shadow_transform(vec4 world_vertex) -{ - out vec3 shadow_coord = (shd_world_matrix*world_vertex).xyz; -} - #pragma MSP stage(fragment) -virtual float get_shadow_factor(int index) +virtual float get_shadow_factor(int index, vec4 world_pos) { if(use_shadow_map) { + if(shadows[index].enabled==0) + return 1.0; + + vec3 shadow_coord = (shadows[index].shd_world_matrix*world_pos).xyz; if(shadow_coord.x<0 || shadow_coord.x>1 || shadow_coord.y<0 || shadow_coord.y>1) return 1.0; - float shadow_sample = texture(shadow_map, shadow_coord); - return mix(1.0, shadow_sample, shadow_darkness); + + vec4 region = shadows[index].region; + float shadow_sample = texture(shadow_map, shadow_coord*vec3(region.zw, 1.0)+vec3(region.xy, 0.0)); + return mix(1.0, shadow_sample, shadows[index].darkness); } else return 1.0;