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
Transformation.fx
1 
3 void ApplyTweening(out float3 MeshSpacePositionTweened,float3 MeshSpacePosition,float3 MeshSpacePosition2,float TweeningFactor){
4  MeshSpacePositionTweened=lerp(MeshSpacePosition,MeshSpacePosition2,TweeningFactor);
5 }
6 
9 void ApplyMeshToWorldSpace(out float3 WorldSpacePosition,float3 MeshSpacePositionCombined,float4x4 MeshToWorldSpace){
10  WorldSpacePosition=mul(float4(MeshSpacePositionCombined,1.0f),MeshToWorldSpace).xyz;
11 }
12 
15 void ApplyTweeningNormal(out float3 MeshSpaceNormalTweened,float3 MeshSpaceNormal,float3 MeshSpaceNormal2,float TweeningFactor){
16  MeshSpaceNormalTweened=lerp(MeshSpaceNormal,MeshSpaceNormal2,TweeningFactor);
17 }
18 
21 void ApplyMeshToWorldSpaceNormal(out float3 WorldSpaceNormal,float3 MeshSpaceNormalCombined,float4x4 MeshToWorldSpace){
22  float3x3 MeshToWorldSpaceDirection=(float3x3)MeshToWorldSpace;
23  WorldSpaceNormal=normalize(mul(MeshSpaceNormalCombined,MeshToWorldSpaceDirection)*determinant(MeshToWorldSpaceDirection));
24 }
25 
28 void ApplyWorldToProjectionSpace(out float4 ProjectionSpacePosition,float3 WorldSpacePosition,float4x4 WorldToProjectionSpace){
29  ProjectionSpacePosition=mul(float4(WorldSpacePosition,1.0f),WorldToProjectionSpace);
30 }
31 
32 
37 void PrepareTangentToWorldSpace(out float3 OutWorldSpaceTangent,out float OutBitangentFactor,float4x4 MeshToWorldSpace,float4 TangentSpaceData){
38  OutWorldSpaceTangent=normalize(mul(TangentSpaceData.xyz,(float3x3)MeshToWorldSpace));
39  OutBitangentFactor=TangentSpaceData.w;
40 }
41 
46 void ComputeTangentToWorldSpace(out float3x3 OutTangentToWorldSpace,float3 WorldSpaceNormal,float3 WorldSpaceTangent,float BitangentFactor){
47  // Compute the bitangent
48  float3 WorldSpaceBitangent=cross(WorldSpaceNormal,WorldSpaceTangent)*BitangentFactor;
49  // Construct the matrix
50  OutTangentToWorldSpace._11=WorldSpaceTangent.x;
51  OutTangentToWorldSpace._21=WorldSpaceTangent.y;
52  OutTangentToWorldSpace._31=WorldSpaceTangent.z;
53  OutTangentToWorldSpace._12=WorldSpaceBitangent.x;
54  OutTangentToWorldSpace._22=WorldSpaceBitangent.y;
55  OutTangentToWorldSpace._32=WorldSpaceBitangent.z;
56  OutTangentToWorldSpace._13=WorldSpaceNormal.x;
57  OutTangentToWorldSpace._23=WorldSpaceNormal.y;
58  OutTangentToWorldSpace._33=WorldSpaceNormal.z;
59 }
60 
63 void TangentSpaceNormalToWorldSpace(out float3 OutWorldSpaceNormal,float3 TangentSpaceNormal,float3x3 TangentToWorldSpace){
64  OutWorldSpaceNormal=normalize(mul(TangentToWorldSpace,TangentSpaceNormal));
65 }
66 
67 
70 void BillboardOffsetConstantSize(out float3 WorldSpacePositionOffset,float3 WorldSpacePosition,float2 BillboardTexCoord,float2 BillboardOrigin,float3 BillboardScaledRightVector,float3 BillboardScaledUpVector){
71  float2 BillboardOffset=BillboardTexCoord-BillboardOrigin;
72  WorldSpacePositionOffset=WorldSpacePosition;
73  WorldSpacePositionOffset+=BillboardScaledRightVector*BillboardOffset.x;
74  WorldSpacePositionOffset+=BillboardScaledUpVector*-BillboardOffset.y;
75 }
76 
77 
80 void BillboardOffsetVariableSize(out float3 WorldSpacePositionOffset,float3 WorldSpacePosition,float2 BillboardTexCoord,float2 BillboardSize,float2 BillboardOrigin,float3 BillboardRightVector,float3 BillboardUpVector){
81  float2 BillboardOffset=(BillboardTexCoord-BillboardOrigin)*BillboardSize;
82  WorldSpacePositionOffset=WorldSpacePosition;
83  WorldSpacePositionOffset+=BillboardRightVector*BillboardOffset.x;
84  WorldSpacePositionOffset+=BillboardUpVector*-BillboardOffset.y;
85 }
86 
87 
91 void BillboardOffsetVariableSizeAndRotation(out float3 WorldSpacePositionOffset,float3 WorldSpacePosition,float2 BillboardTexCoord,float2 BillboardSize,float BillboardRotation,float2 BillboardOrigin,float3 BillboardRightVector,float3 BillboardUpVector){
92  float2 SineCosine;
93  sincos(BillboardRotation,SineCosine.x,SineCosine.y);
94  float2 BillboardOffset=(BillboardTexCoord-BillboardOrigin)*BillboardSize;
95  WorldSpacePositionOffset=WorldSpacePosition;
96  WorldSpacePositionOffset+=(BillboardRightVector*SineCosine.y+BillboardUpVector*SineCosine.x)*BillboardOffset.x;
97  WorldSpacePositionOffset+=(BillboardUpVector*SineCosine.y-BillboardRightVector*SineCosine.x)*-BillboardOffset.y;
98 }
99 
100 
104 void MaximizeProjectionZ(out float4 ProjectionSpacePositionBackground,float4 ProjectionSpacePosition){
105  ProjectionSpacePositionBackground.xyw=ProjectionSpacePosition.xyw;
106  ProjectionSpacePositionBackground.z=ProjectionSpacePosition.w*0.999f;
107 }