所以我一直致力于照明,并且为了阴影贴图的目的,我基于半径而不是三个衰减因子(恒定,线性和二次)进行光衰减,而且......它看起来并不像靠近边缘非常好。
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
答案 0 :(得分:4)
存在无数个可能的(不是基于物理的)衰减。我喜欢使用的是约翰·查普曼(参见here),它使用0和光源半径之间的平滑插值:
attenuation = smoothstep(light.radius, 0, length(light.pos - FragPos));
可能的扩展是引入一个额外的指数(compression
),可以用来控制衰减应该如何减少:
attenuation = pow(smoothstep(light.radius, 0, length(light.pos - FragPos)), compression);