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 に答える