Shaders for Shadows
Shader code for rendering shadows of translucent occluders, soft shadows and single scattering with moment shadow maps.
 All Classes Files Functions Variables Pages
LightSources.fx
1 
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;
18 }
19 
31 void ComputePointLightIrradiance(out float3 IdealIncomingIrradiance,float3 UnitSphereIrradiance,float InvLightDistance){
32  IdealIncomingIrradiance=UnitSphereIrradiance*(InvLightDistance*InvLightDistance);
33 }
34 
35 
39 void ComputePointLightUnitSphereIrradiance(out float3 UnitSphereIrradiance,float3 Power){
40  // Irradiance is power per area, so dividing by the area of the unit sphere
41  // (4*pi) does the trick
42  UnitSphereIrradiance=0.07957747154594766788444188168626f*Power;
43 }
44 
45 
52 void ComputeSpotConeCoefficients(out float2 ConeAngleCoefficients,out float3 MaxUnitSphereIrradiance,float InnerConeAngle,float OuterConeAngle,float3 Power){
53  // Compute the two cosine values
54  float CosInnerCone=cos(InnerConeAngle);
55  float CosOuterCone=cos(OuterConeAngle);
56  // Solve m*CosInnerCone+b=1 and m*CosOuterCone+b=0 for m and b
57  // m*(CosInnerCone-CosOuterCone)=1 => m=1/(CosInnerCone-CosOuterCone)
58  // b=-m*CosOuterCone
59  ConeAngleCoefficients.x=1.0f/(CosInnerCone-CosOuterCone);
60  ConeAngleCoefficients.y=-ConeAngleCoefficients.x*CosOuterCone;
61  // Compute the maximal unit sphere irradiance (see
62  // Documents/PhysicsBasedSpotLight.lyx for the integrals leading to this
63  // formula)
64  const float PI=3.1415926535897932384626433832795f;
65  MaxUnitSphereIrradiance=Power/(PI*(2.0f-CosInnerCone-CosOuterCone));
66 }
67 
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);
74 }
75 
79 void ComputeSpotLightUnitSphereIrradiance(out float3 UnitSphereIrradiance,float3 MaxUnitSphereIrradiance,float SpotConeAttenuation){
80  UnitSphereIrradiance=MaxUnitSphereIrradiance*SpotConeAttenuation;
81 }