13 void ComputePointLightDirection(out float3 IdealIncomingWorldSpaceLightDirection,out
float InvLightDistance,float3 WorldSpaceLightPosition,float3 WorldSpacePosition){
14 float3 UnnormalizedLightDirection=WorldSpacePosition-WorldSpaceLightPosition;
15 float LightDistanceSq=dot(UnnormalizedLightDirection,UnnormalizedLightDirection);
16 InvLightDistance=rsqrt(LightDistanceSq);
17 IdealIncomingWorldSpaceLightDirection=UnnormalizedLightDirection*InvLightDistance;
31 void ComputePointLightIrradiance(out float3 IdealIncomingIrradiance,float3 UnitSphereIrradiance,
float InvLightDistance){
32 IdealIncomingIrradiance=UnitSphereIrradiance*(InvLightDistance*InvLightDistance);
39 void ComputePointLightUnitSphereIrradiance(out float3 UnitSphereIrradiance,float3 Power){
42 UnitSphereIrradiance=0.07957747154594766788444188168626f*Power;
52 void ComputeSpotConeCoefficients(out float2 ConeAngleCoefficients,out float3 MaxUnitSphereIrradiance,
float InnerConeAngle,
float OuterConeAngle,float3 Power){
54 float CosInnerCone=cos(InnerConeAngle);
55 float CosOuterCone=cos(OuterConeAngle);
59 ConeAngleCoefficients.x=1.0f/(CosInnerCone-CosOuterCone);
60 ConeAngleCoefficients.y=-ConeAngleCoefficients.x*CosOuterCone;
64 const float PI=3.1415926535897932384626433832795f;
65 MaxUnitSphereIrradiance=Power/(PI*(2.0f-CosInnerCone-CosOuterCone));
71 void ComputeSpotConeAttenuation(out
float SpotConeAttenuation,float3 IdealIncomingWorldSpaceLightDirection,float3 WorldSpaceConeAxisDirection,float2 ConeAngleCoefficients){
72 float CosSpotAngle=dot(IdealIncomingWorldSpaceLightDirection,WorldSpaceConeAxisDirection);
73 SpotConeAttenuation=saturate(ConeAngleCoefficients.x*CosSpotAngle+ConeAngleCoefficients.y);
79 void ComputeSpotLightUnitSphereIrradiance(out float3 UnitSphereIrradiance,float3 MaxUnitSphereIrradiance,
float SpotConeAttenuation){
80 UnitSphereIrradiance=MaxUnitSphereIrradiance*SpotConeAttenuation;