GLSL 照明 - 基于光半径的衰减

GLSL lighting- Attenuation based on a light radius

所以我一直在研究照明,为了阴影映射的目的,我根据半径而不是三个衰减因子(常数、线性和二次)进行了光衰减,嗯......它看起来靠近边缘非常好。

http://i.stack.imgur.com/H680a.png

它切断得非常快,着色器代码看起来像这样...

#version 330 core

//FragPos = world-space position of current fragment (vec3)
//light.radius is a float.
vec3 distance = (light.pos - FragPos) / light.radius;
float attenuation = 1.0f - dot(distance, distance);

那么我应该如何让它看起来不那么糟糕呢?例如, This

存在无数种可能的(不是基于物理的)衰减。我喜欢使用的是 John Chapman 的那个(参见 here),它使用 0 和光源半径之间的平滑步长插值:

attenuation = smoothstep(light.radius, 0, length(light.pos - FragPos));

一种可能的扩展是引入一个额外的指数 (compression),可用于控制衰减应如何减少:

attenuation = pow(smoothstep(light.radius, 0, length(light.pos - FragPos)), compression);