float darkness;
int matrix_index;
vec4 region;
+ float bias;
};
uniform ShadowMap
int type = shadows[index].type;
vec3 shadow_coord;
if(type==1)
+ {
shadow_coord = (shd_world_matrix[shadows[index].matrix_index]*world_pos).xyz;
+ shadow_coord.z -= shadows[index].bias;
+ }
else
return 1.0;
return 1.0;
vec4 region = shadows[index].region;
- float shadow_sample = texture(shadow_map, shadow_coord*vec3(region.zw, 1.0)+vec3(region.xy, 0.0));
+ float shadow_sample = texture(shadow_map, vec3(shadow_coord.xy*region.zw+region.xy, shadow_coord.z));
return mix(1.0, shadow_sample, shadows[index].darkness);
}
else
shdata.uniform(base+".darkness", 1.0f);
shdata.uniform(base+".matrix_index", 0);
shdata.uniform(base+".region", Vector4(0.0f, 0.0f, 1.0f, 1.0f));
+ shdata.uniform(base+".bias", 0.0f);
}
Matrix dummy_matrix;
for(const ShadowedLight &l: lights)
l.shadow_caster->setup_frame(renderer);
+ for(const ShadowedLight &l: lights)
+ {
+ string base = format("shadows[%d]", l.index);
+ if(l.type==DIRECTIONAL)
+ shdata.uniform(base+".bias", depth_bias/l.region.width);
+ }
+
vector<Matrix> shadow_matrices;
shadow_matrices.reserve(views.size());
for(ShadowView &v: views)
v.camera.set_depth_clip(-radius, radius);
}
- Matrix to_texcoord = Matrix().translate(Vector3(0.5f, 0.5f, 0.5f-depth_bias/light.region.width)).scale(0.5f);
+ Matrix to_texcoord = Matrix().translate(Vector3(0.5f, 0.5f, 0.5f)).scale(0.5f);
shadow_matrices.push_back(to_texcoord*v.camera.get_projection_matrix()*v.camera.get_view_matrix());
}