当角度> 1时,聚光灯角度衰减导致锐边。 90

时间:2013-07-05 10:46:27

标签: opengl glsl lighting

如果锥角超过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;
}

2 个答案:

答案 0 :(得分:1)

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

在代码中你应该计算:

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

然后用它来计算衰减:

float dif = Pi/2.0 - lightAngle;
float angularAttenuation = clamp((lightAngle - rhoAngle) / dif, 0.0, 1.0);

答案 1 :(得分:0)

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