vk: rt: invert pdf for point lights
This makes math even more stable, but it removes imprecisions that were accidentally helping the rendered image. Thus it looks a bit darker. Fixing that would need proper sampling, with disc angle and what not.
This commit is contained in:
parent
dd17dee35d
commit
02afc7b320
|
@ -41,6 +41,7 @@ void computePointLights(vec3 P, vec3 N, uint cluster_index, vec3 view_dir, Mater
|
||||||
if (light_dot < 1e-5)
|
if (light_dot < 1e-5)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// TODO split into separate spotlihgts and point lights arrays
|
||||||
const float spot_dot = -dot(light_dir_norm, dir);
|
const float spot_dot = -dot(light_dir_norm, dir);
|
||||||
const float stopdot2 = lights.m.point_lights[i].dir_stopdot2.a;
|
const float stopdot2 = lights.m.point_lights[i].dir_stopdot2.a;
|
||||||
if (spot_dot < stopdot2)
|
if (spot_dot < stopdot2)
|
||||||
|
@ -57,8 +58,8 @@ void computePointLights(vec3 P, vec3 N, uint cluster_index, vec3 view_dir, Mater
|
||||||
__LINE__, spot_dot, stopdot, stopdot2, spot_attenuation);
|
__LINE__, spot_dot, stopdot, stopdot2, spot_attenuation);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
const float kSpotAttenuationThreshold = 1e-3;
|
// Skip the rest of the computation for points completely outside of the light cone
|
||||||
if (spot_attenuation < kSpotAttenuationThreshold)
|
if (spot_attenuation <= 0.)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,14 +94,15 @@ void computePointLights(vec3 P, vec3 N, uint cluster_index, vec3 view_dir, Mater
|
||||||
|
|
||||||
// d2=4489108.500000 r2=1.000000 dist=2118.751465 spot_attenuation=0.092902 INVALID pdf=-316492608.000000
|
// d2=4489108.500000 r2=1.000000 dist=2118.751465 spot_attenuation=0.092902 INVALID pdf=-316492608.000000
|
||||||
// Therefore, need to clamp denom with max
|
// Therefore, need to clamp denom with max
|
||||||
const float pdf = 1. / (max(1e-4, 1. - sqrt(d2 - r2) / dist) * spot_attenuation);
|
// TODO need better sampling right nao
|
||||||
|
const float one_over_pdf = max(0., 1. - sqrt(d2 - r2) / dist) * spot_attenuation;
|
||||||
#ifdef DEBUG_VALIDATE_EXTRA
|
#ifdef DEBUG_VALIDATE_EXTRA
|
||||||
if (IS_INVALID(pdf) || pdf <= 0.) {
|
if (IS_INVALID(one_over_pdf) || one_over_pdf < 0.) {
|
||||||
debugPrintfEXT("light.glsl:%d d2=%f r2=%f dist=%f spot_attenuation=%f INVALID pdf=%f",
|
debugPrintfEXT("light.glsl:%d d2=%f r2=%f dist=%f spot_attenuation=%f INVALID one_over_pdf=%f",
|
||||||
__LINE__, d2, r2, dist, spot_attenuation, pdf);
|
__LINE__, d2, r2, dist, spot_attenuation, one_over_pdf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
color /= pdf;
|
color *= one_over_pdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (dot(color,color) < color_culling_threshold)
|
// if (dot(color,color) < color_culling_threshold)
|
||||||
|
|
Loading…
Reference in New Issue