1

如果锥角超过 90 度,我的聚光灯的角度衰减不能正常工作。从 0.1 到 90,衰减从锥体中心到边缘是平滑的,但从 90 到 179.9,它会变得越来越锐利。

这是我的衰减代码:

uniform vec3 lightPosition; // Light's position
uniform vec3 lightDirection; // Light's direction
uniform float lightAngleCos: // Cosine of the half of the cone angle
uniform float lightRange: // Light's range

// Get the light vector
vec3 pixelToLight = lightPosition - position.xyz;
vec3 normPTL = normalize(pixelToLight);    

// Get the dot product between the light direction and the light vector
float rho = dot(normPTL, -lightDirection);

if(rho > lightAngleCos)
{
    float dif = 1.0 - lightAngleCos;
    float angularAttenuation = clamp((rho - lightAngleCos) / dif, 0.0, 1.0);
    float radialAttenuation = 1.0 - clamp(length(pixelToLight) / (lightRange), 0.0, 1.0);
    float attenuation = angularAttenuation * radialAttenuation;

    // Apply attenuation
    out_color = color * attenuation;
}
4

2 回答 2

1

用实际角度计算它,而不是用 cos 计算,因为 cos 不是线性的,所以你在 0 附近有非常平滑的衰减梯度,在 180 附近有非常尖锐的衰减梯度,你可以通过查看 0 附近和 Pi/2 附近的 cos 图来看到。

在代码中,您应该计算:

rhoAngle = acos(rho);
lightAngleCos = acos(lightAngleCos);

然后用它来计算衰减:

float dif = Pi/2.0 - lightAngle;
float angularAttenuation = clamp((lightAngle - rhoAngle) / dif, 0.0, 1.0);
于 2013-07-05T15:18:57.683 回答
0

我原来的解决方案是完全正确的。是我的锥形网格造成了限制。

于 2013-07-06T12:39:12.313 回答