vec4 extract = vec4(1.0, 0.01, 0.0001, 0.000001);
float shadowCube(vec3 v, samplerCube t) {
vec4 col = textureCube(t, v).rgba;
return dot(col, extract);
}
const vec3 o1 = vec3(1.0, 0.5, 0.3);
const vec3 o2 = vec3(0.3, 1.0, 0.5);
const vec3 o3 = vec3(0.5, 0.3, 1.0);
const vec3 o4 = vec3(1.0, 1.0, 0.5);
const vec3 o5 = vec3(0.5, 1.0, 1.0);
const vec3 o6 = vec3(1.0, 0.5, 1.0);
float shadow(vec3 v, float l) {
float res = 0.1;
float d = shadowCube(v, shadowmap2);
// vec3 noise1 = texture2D(noise, vec2(d*10.0, d*20.0)*v.xy).rgb;
// vec3 noise2 = texture2D(noise, vec2(d*15.0, d*25.0)*v.yz).rgb;
// vec3 noise3 = texture2D(noise, vec2(d*25.0, d*35.0)*v.zx).rgb;
vec3 noise1 = texture2D(noise, v.xy).rgb;
vec3 noise2 = texture2D(noise, v.yz).rgb;
vec3 noise3 = texture2D(noise, v.zx).rgb;
float delta = (l+1.0) / (d+1.0) - 1.0;
delta *= delta;
noise1 = (noise1-0.5)*0.5;
noise2 = (noise2-0.5)*0.5;
noise3 = (noise3-0.5)*0.5;
vec3 offset1 = v + (o1 + noise1)* delta;
vec3 offset2 = v + (o2 + noise2)* delta;
vec3 offset3 = v + (o2 + noise3)* delta;
vec3 offset4 = v + (o4 + noise1*noise2) * delta;
vec3 offset5 = v + (o5 + noise2*noise3) * delta;
vec3 offset6 = v + (o6 + noise1*noise3) * delta;
float weight = 1.0 / 2.0;
float d1 = shadowCube(offset1, shadowmap1);
float d2 = shadowCube(offset2, shadowmap1);
float d3 = shadowCube(offset3, shadowmap1);
float d4 = shadowCube(offset4, shadowmap1);
float d5 = shadowCube(offset5, shadowmap1);
float d6 = shadowCube(offset6, shadowmap1);
float d0 = shadowCube(v, shadowmap1);
if (d1 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
if (d2 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
/*
if (d3 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
if (d4 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
if (d5 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
if (d6 >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
if ( >= l)
res += weight;
// else
// res += weight * 0.1 * pow(l+1.0, 3.0);
*/
return res * 0.909091;
}