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
Lighting.fx
1 
3 void ScaleRadiance(out float3 OutRadiance,float3 Factor,float3 Radiance){
4  OutRadiance=Factor*Radiance;
5 }
6 
9 void ScaleAndAddRadiance(out float3 OutRadiance,float Factor,float3 Radiance1,float3 Radiance2){
10  OutRadiance=Factor*Radiance1+Radiance2;
11 }
12 
14 void AddRadiance(out float3 OutRadiance,float3 Radiance1,float3 Radiance2){
15  OutRadiance=Radiance1+Radiance2;
16 }
17 
19 void ComputeSpecularLightingColor(out float3 SpecularLightingColor,float3 UsedSpecularColor,float UnraisedSpecularIntensity,float SpecularPower){
20  SpecularLightingColor=UsedSpecularColor*pow(UnraisedSpecularIntensity,SpecularPower);
21 }
22 
25 void ApplyShadowIntensity(out float3 OutShadowedIrradiance,float3 Irradiance,float ShadowIntensity){
26  OutShadowedIrradiance=Irradiance*(1.0f-ShadowIntensity);
27 }
28 
32 void CopyWorldSpacePosition(out float3 OutWorldSpacePosition,float3 WorldSpacePosition){
33  OutWorldSpacePosition=WorldSpacePosition;
34 }
35 
38 void NormalizeNormal(out float3 NormalizedNormal,float3 Normal){
39  NormalizedNormal=normalize(Normal);
40 }
41 
44 void ComputeWorldSpaceViewDirection(out float3 WorldSpaceViewDirection,float3 WorldSpacePosition,float3 WorldSpaceCameraPosition){
45  WorldSpaceViewDirection=normalize(WorldSpaceCameraPosition-WorldSpacePosition);
46 }
47 
51 void ComputeWorldSpaceViewReflectionDirection(out float3 WorldSpaceViewReflectionDirection,float3 WorldSpaceViewDirection,float3 WorldSpaceNormal){
52  WorldSpaceViewReflectionDirection=-WorldSpaceViewDirection-2.0f*dot(-WorldSpaceViewDirection,WorldSpaceNormal)*WorldSpaceNormal;
53 }
54 
57 void ComputeCosineLobeFactor(out float CosineLobeFactor,float CosineLobePower){
58  const float INV_2PI=0.15915494309189533576888376337251f;
59  const float INV_PI=0.31830988618379067153776752674503;
60  CosineLobeFactor=CosineLobePower*INV_2PI+INV_PI;
61 }
62 
66 void ComputeCosineLobeBRDF(out float BRDFCoefficient,float CosineLobeFactor,float CosineLobePower,float3 WorldSpaceViewReflectionDirection,float3 IdealIncomingWorldSpaceLightDirection){
67  BRDFCoefficient=pow(max(0.0f,-dot(WorldSpaceViewReflectionDirection,IdealIncomingWorldSpaceLightDirection)),CosineLobePower)*CosineLobeFactor;
68 }
69 
70 
75 void ComputeTorranceSparrowConstants(out float TorranceSparrowFactor,out float MinFresnelTerm,out float NormalDistributionPower,out float SchlickSmithLerpFactor,float CosineLobePower){
76  const float PI=3.1415926535897932384626433832795f;
77  MinFresnelTerm=0.5f;
78  NormalDistributionPower=CosineLobePower;
79  TorranceSparrowFactor=(NormalDistributionPower+2.0f)/(8.0f*PI);
80  SchlickSmithLerpFactor=rsqrt(0.25f*PI*NormalDistributionPower+0.5f*PI);
81 }
82 
88 void ComputeTorranceSparrowBRDF(out float BRDFCoefficient,float TorranceSparrowFactor,float MinFresnelTerm,float NormalDistributionPower,float SchlickSmithLerpFactor,float3 WorldSpaceViewDirection,float3 IdealIncomingWorldSpaceLightDirection,float3 WorldSpaceNormal){
89  // Construct the half vector
90  float3 WorldSpaceHalfVector=normalize(WorldSpaceViewDirection-IdealIncomingWorldSpaceLightDirection);
91  // Compute all relevant dot products and do not let them get negative
92  float NormalDotLight=saturate(dot(WorldSpaceNormal,-IdealIncomingWorldSpaceLightDirection));
93  float NormalDotView=saturate(dot(WorldSpaceNormal,WorldSpaceViewDirection));
94  float NormalDotHalf=saturate(dot(WorldSpaceNormal,WorldSpaceHalfVector));
95  float HalfDotView=saturate(dot(WorldSpaceHalfVector,WorldSpaceViewDirection));
96  // Compute the normal distribution term
97  float NormalDistributionTerm=pow(NormalDotHalf,NormalDistributionPower);
98  // Approximate the Fresnel term using a spherical Gaussian approximation
99  float FresnelTerm=lerp(MinFresnelTerm,1.0f,exp(-6.0f*HalfDotView));
100  // Compute the visibility term which includes the geometry term
101  float VisibilityTerm=1.0f/(lerp(NormalDotLight,1.0f,SchlickSmithLerpFactor)*lerp(NormalDotView,1.0f,SchlickSmithLerpFactor));
102  // Put it all together
103  BRDFCoefficient=max(0.0f,TorranceSparrowFactor*FresnelTerm*NormalDistributionTerm*VisibilityTerm);
104 }
105 
117 void ComputeIrradianceCosineFactor(out float IrradianceCosineFactor,float3 IdealIncomingWorldSpaceLightDirection,float3 WorldSpaceNormal){
118  IrradianceCosineFactor=max(0.0f,-dot(IdealIncomingWorldSpaceLightDirection,WorldSpaceNormal));
119 }
120 
136 void IdealIntegrator(out float3 OutgoingRadiance,float IrradianceCosineFactor,float IdealBRDFCoefficient,float3 IdealIncomingIrradiance){
137  OutgoingRadiance=(IrradianceCosineFactor*IdealBRDFCoefficient)*IdealIncomingIrradiance;
138 }
139 
140 
149 void AmbientIntegrator(out float3 OutgoingRadiance,float3 IncomingRadiance){
150  OutgoingRadiance=IncomingRadiance;
151 }