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

3

我一直在处理照明问题,为了进行阴影映射,我使用基于半径的光衰减,而不是三个衰减因子(常数,线性和二次),但是... 在边缘附近看起来不太好。

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

那么我应该如何使它看起来不那么糟糕呢?例如,这个
1个回答

4

存在着无数种可能的(非基于物理的)衰减方式。我喜欢使用John Chapman提出的一种方式(详见此处),它使用了一个在光源半径和0之间进行平滑插值的方法:

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

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

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

错误 C7623:从“vec3”到“float”的类型隐式缩小。 - James Pae
smoothStep的第三个参数应该是一个vec3类型,其他都是float类型,对吧? - James Pae
不,所有三个参数都是浮点数。我会更新答案,因为我忘记了长度函数。 - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接