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
Constants.fx
Go to the documentation of this file.
1 
7 void InvertMatrix(out float4x4 OutBToA,float4x4 AToB){
8  float InvDeterminant=AToB._11*(AToB._22*AToB._33-AToB._32*AToB._23)
9  -AToB._12*(AToB._21*AToB._33-AToB._31*AToB._23)
10  +AToB._13*(AToB._21*AToB._32-AToB._31*AToB._22);
11  // Invert the 3*3 matrix
12  InvDeterminant=1.0f/InvDeterminant;
13  OutBToA._11=(AToB._22*AToB._33-AToB._23*AToB._32)*InvDeterminant;
14  OutBToA._12=(AToB._12*AToB._33-AToB._32*AToB._13)*-InvDeterminant;
15  OutBToA._13=(AToB._12*AToB._23-AToB._22*AToB._13)*InvDeterminant;
16  OutBToA._21=(AToB._21*AToB._33-AToB._23*AToB._31)*-InvDeterminant;
17  OutBToA._22=(AToB._11*AToB._33-AToB._31*AToB._13)*InvDeterminant;
18  OutBToA._23=(AToB._11*AToB._23-AToB._21*AToB._13)*-InvDeterminant;
19  OutBToA._31=(AToB._21*AToB._32-AToB._31*AToB._22)*InvDeterminant;
20  OutBToA._32=(AToB._11*AToB._32-AToB._31*AToB._12)*-InvDeterminant;
21  OutBToA._33=(AToB._11*AToB._22-AToB._12*AToB._21)*InvDeterminant;
22  // Invert the translation of the matrix
23  OutBToA._41=-(AToB._41*OutBToA._11+AToB._42*OutBToA._21+AToB._43*OutBToA._31);
24  OutBToA._42=-(AToB._41*OutBToA._12+AToB._42*OutBToA._22+AToB._43*OutBToA._32);
25  OutBToA._43=-(AToB._41*OutBToA._13+AToB._42*OutBToA._23+AToB._43*OutBToA._33);
26  // Ensure that all entries are set
27  OutBToA._14=OutBToA._24=OutBToA._34=0.0f;
28  OutBToA._44=1.0f;
29 }
30 
31 
33 void TransformMatrix(out float4x4 OutAToCSpace,float4x4 AToBSpace,float4x4 BToCSpace){
34  OutAToCSpace=mul(AToBSpace,BToCSpace);
35 }
36 
37 
40 void ComputeAverageScaling(out float OutAverageScaling,float4x4 Matrix){
41  float3 Scaling=float3(dot(Matrix[0],Matrix[0]),dot(Matrix[1],Matrix[1]),dot(Matrix[2],Matrix[2]));
42  Scaling=sqrt(Scaling);
43  OutAverageScaling=(Scaling.x+Scaling.y+Scaling.z)/3.0f;
44 }
45 
46 
49 void ComputeClippingPlanes(out float4 OutLeft,out float4 OutRight,out float4 OutTop,out float4 OutBottom,out float4 OutNear,out float4 OutFar,float4x4 WorldToProjectionSpace){
50  // The left clipping plane
51  OutLeft=normalize(float4(
52  WorldToProjectionSpace._14+WorldToProjectionSpace._11,
53  WorldToProjectionSpace._24+WorldToProjectionSpace._21,
54  WorldToProjectionSpace._34+WorldToProjectionSpace._31,
55  WorldToProjectionSpace._44+WorldToProjectionSpace._41));
56  // The right clipping plane
57  OutRight=normalize(float4(
58  WorldToProjectionSpace._14-WorldToProjectionSpace._11,
59  WorldToProjectionSpace._24-WorldToProjectionSpace._21,
60  WorldToProjectionSpace._34-WorldToProjectionSpace._31,
61  WorldToProjectionSpace._44-WorldToProjectionSpace._41));
62  // The top clipping plane
63  OutTop=normalize(float4(
64  WorldToProjectionSpace._14-WorldToProjectionSpace._12,
65  WorldToProjectionSpace._24-WorldToProjectionSpace._22,
66  WorldToProjectionSpace._34-WorldToProjectionSpace._32,
67  WorldToProjectionSpace._44-WorldToProjectionSpace._42));
68  // The bottom clipping plane
69  OutBottom=normalize(float4(
70  WorldToProjectionSpace._14+WorldToProjectionSpace._12,
71  WorldToProjectionSpace._24+WorldToProjectionSpace._22,
72  WorldToProjectionSpace._34+WorldToProjectionSpace._32,
73  WorldToProjectionSpace._44+WorldToProjectionSpace._42));
74  // The near clipping plane
75  OutNear=normalize(float4(
76  WorldToProjectionSpace._13,
77  WorldToProjectionSpace._23,
78  WorldToProjectionSpace._33,
79  WorldToProjectionSpace._43));
80  // The far clipping plane
81  OutFar=normalize(float4(
82  WorldToProjectionSpace._14-WorldToProjectionSpace._13,
83  WorldToProjectionSpace._24-WorldToProjectionSpace._23,
84  WorldToProjectionSpace._34-WorldToProjectionSpace._33,
85  WorldToProjectionSpace._44-WorldToProjectionSpace._43));
86 }
87 
88 
93 void ComputeBillboardData(out float3 OutBillboardNormal,out float3 BillboardUpVector,out float3 BillboardRightVector,out float3 BillboardScaledUpVector,out float3 BillboardScaledRightVector,float2 BillboardSize,float4x4 WorldToViewSpace){
94  // Since the world to view space transformation always has an orthogonal 3x3
95  // part its transpose can be used instead of the view to world space
96  // transformation
97  OutBillboardNormal=float3(-WorldToViewSpace._13,-WorldToViewSpace._23,-WorldToViewSpace._33);
98  OutBillboardRightVector=float3(WorldToViewSpace._11,WorldToViewSpace._21,WorldToViewSpace._31);
99  OutBillboardUpVector=float3(WorldToViewSpace._12,WorldToViewSpace._22,WorldToViewSpace._32);
100  OutBillboardScaledRightVector=OutBillboardRightVector*BillboardSize.x;
101  OutBillboardScaledUpVector=OutBillboardUpVector*BillboardSize.y;
102 }
103 
104 
106 void ComputeWorldSpaceCameraPosition(out float3 OutWorldSpaceCameraPosition,float4x4 ViewToWorldSpace){
107  OutWorldSpaceCameraPosition=float3(ViewToWorldSpace._41,ViewToWorldSpace._42,ViewToWorldSpace._43);
108 }
109 
111 void ComputeMeshSpaceCameraPosition(out float3 OutMeshSpaceCameraPosition,float4x4 ViewToMeshSpace){
112  OutMeshSpaceCameraPosition=float3(ViewToMeshSpace._41,ViewToMeshSpace._42,ViewToMeshSpace._43);
113 }
void ComputeClippingPlanes(out float4 OutLeft, out float4 OutRight, out float4 OutTop, out float4 OutBottom, out float4 OutNear, out float4 OutFar, float4x4 WorldToProjectionSpace)
Definition: Constants.fx:49
void InvertMatrix(out float4x4 OutBToA, float4x4 AToB)
Definition: Constants.fx:7
void ComputeWorldSpaceCameraPosition(out float3 OutWorldSpaceCameraPosition, float4x4 ViewToWorldSpace)
Definition: Constants.fx:106
void TransformMatrix(out float4x4 OutAToCSpace, float4x4 AToBSpace, float4x4 BToCSpace)
Definition: Constants.fx:33
void ComputeAverageScaling(out float OutAverageScaling, float4x4 Matrix)
Definition: Constants.fx:40
void ComputeMeshSpaceCameraPosition(out float3 OutMeshSpaceCameraPosition, float4x4 ViewToMeshSpace)
Definition: Constants.fx:111
void ComputeBillboardData(out float3 OutBillboardNormal, out float3 BillboardUpVector, out float3 BillboardRightVector, out float3 BillboardScaledUpVector, out float3 BillboardScaledRightVector, float2 BillboardSize, float4x4 WorldToViewSpace)
Definition: Constants.fx:93