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