Change the light attenuation formulas.
-Much better looking, physically based. -Almost negligible extra cost.
This commit is contained in:
@@ -249,6 +249,15 @@ float quick_hash(vec2 pos) {
|
||||
return fract(sin(dot(pos * 19.19, vec2(49.5791, 97.413))) * 49831.189237);
|
||||
}
|
||||
|
||||
float get_omni_attenuation(float distance, float inv_range, float decay) {
|
||||
float nd = distance * inv_range;
|
||||
nd *= nd;
|
||||
nd *= nd; // nd^4
|
||||
nd = max(1.0 - nd, 0.0);
|
||||
nd *= nd; // nd^2
|
||||
return nd * pow(max(distance, 0.0001), -decay);
|
||||
}
|
||||
|
||||
void main() {
|
||||
#ifdef MODE_LIGHT_PROBES
|
||||
int probe_index = int(gl_GlobalInvocationID.x);
|
||||
@@ -300,7 +309,7 @@ void main() {
|
||||
|
||||
d /= lights.data[i].range;
|
||||
|
||||
attenuation = pow(max(1.0 - d, 0.0), lights.data[i].attenuation);
|
||||
attenuation = get_omni_attenuation(d, 1.0 / lights.data[i].range, lights.data[i].attenuation);
|
||||
|
||||
if (lights.data[i].type == LIGHT_TYPE_SPOT) {
|
||||
vec3 rel = normalize(position - light_pos);
|
||||
|
||||
Reference in New Issue
Block a user