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

时间:2016-06-10 18:29:17

标签: opengl glsl lighting

所以我一直致力于照明,并且为了阴影贴图的目的,我基于半径而不是三个衰减因子(恒定,线性和二次)进行光衰减,而且......它看起来并不像靠近边缘非常好。

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

1 个答案:

答案 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);