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
ComplexAlgebra.fx
Go to the documentation of this file.
1 
7 float2 Conjugate(float2 Z){
8  return float2(Z.x,-Z.y);
9 }
11 float2 Multiply(float2 LHS,float2 RHS){
12  return float2(LHS.x*RHS.x-LHS.y*RHS.y,LHS.x*RHS.y+LHS.y*RHS.x);
13 }
15 float Magnitude(float2 Z){
16  return sqrt(dot(Z,Z));
17 }
20 float2 Divide(float2 Numerator,float2 Denominator){
21  return float2(Numerator.x*Denominator.x+Numerator.y*Denominator.y,-Numerator.x*Denominator.y+Numerator.y*Denominator.x)/dot(Denominator,Denominator);
22 }
25 float2 Reciprocal(float2 Z){
26  return float2(Z.x,-Z.y)/dot(Z,Z);
27 }
29 float2 Square(float2 Z){
30  return float2(Z.x*Z.x-Z.y*Z.y,2.0f*Z.x*Z.y);
31 }
33 float2 Cube(float2 Z){
34  return Multiply(Square(Z),Z);
35 }
41 float2 SquareRootUnsafe(float2 Z){
42  float ZLengthSq=dot(Z,Z);
43  float ZLengthInv=rsqrt(ZLengthSq);
44  float2 UnnormalizedRoot=Z*ZLengthInv+float2(1.0f,0.0f);
45  float UnnormalizedRootLengthSq=dot(UnnormalizedRoot,UnnormalizedRoot);
46  float NormalizationFactorInvSq=UnnormalizedRootLengthSq*ZLengthInv;
47  float NormalizationFactor=rsqrt(NormalizationFactorInvSq);
48  return NormalizationFactor*UnnormalizedRoot;
49 }
54 float2 SquareRoot(float2 Z){
55  float2 ZPositiveRealPart=float2(abs(Z.x),Z.y);
56  float2 ComputedRoot=SquareRootUnsafe(ZPositiveRealPart);
57  return (Z.x>=0.0)?ComputedRoot:ComputedRoot.yx;
58 }
62 float2 CubicRoot(float2 Z){
63  float Argument=atan2(Z.y,Z.x);
64  float NewArgument=Argument/3.0f;
65  float2 NormalizedRoot;
66  sincos(NewArgument,NormalizedRoot.y,NormalizedRoot.x);
67  return NormalizedRoot*pow(dot(Z,Z),1.0f/6.0f);
68 }
69 
73 float2x2 Conjugate(float2x2 Vector){
74  return float2x2(Vector[0].x,-Vector[0].y,Vector[1].x,-Vector[1].y);
75 }
76 float3x2 Conjugate(float3x2 Vector){
77  return float3x2(Vector[0].x,-Vector[0].y,Vector[1].x,-Vector[1].y,Vector[2].x,-Vector[2].y);
78 }
79 float4x2 Conjugate(float4x2 Vector){
80  return float4x2(Vector[0].x,-Vector[0].y,Vector[1].x,-Vector[1].y,Vector[2].x,-Vector[2].y,Vector[3].x,-Vector[3].y);
81 }
82 void Conjugate(out float2 OutConjugateVector[5],float2 Vector[5]){
83  [unroll] for(int i=0;i!=5;++i){
84  OutConjugateVector[i]=float2(Vector[i].x,-Vector[i].x);
85  }
86 }
88 
89 
90 #define POLYNOMIAL_DEGREE 1
91 
94 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
95  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
96  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
97  Result=Multiply(X,Result)+pCoefficient[i];
98  }
99  return Result;
100 }
101 #define POLYNOMIAL_DEGREE 2
102 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
103  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
104  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
105  Result=Multiply(X,Result)+pCoefficient[i];
106  }
107  return Result;
108 }
109 #define POLYNOMIAL_DEGREE 3
110 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
111  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
112  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
113  Result=Multiply(X,Result)+pCoefficient[i];
114  }
115  return Result;
116 }
117 #define POLYNOMIAL_DEGREE 4
118 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
119  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
120  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
121  Result=Multiply(X,Result)+pCoefficient[i];
122  }
123  return Result;
124 }
125 #define POLYNOMIAL_DEGREE 5
126 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
127  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
128  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
129  Result=Multiply(X,Result)+pCoefficient[i];
130  }
131  return Result;
132 }
133 #define POLYNOMIAL_DEGREE 6
134 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
135  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
136  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
137  Result=Multiply(X,Result)+pCoefficient[i];
138  }
139  return Result;
140 }
141 #define POLYNOMIAL_DEGREE 7
142 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
143  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
144  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
145  Result=Multiply(X,Result)+pCoefficient[i];
146  }
147  return Result;
148 }
149 #define POLYNOMIAL_DEGREE 8
150 float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1],float2 X){
151  float2 Result=pCoefficient[POLYNOMIAL_DEGREE];
152  [unroll] for(int i=POLYNOMIAL_DEGREE-1;i>=0;--i){
153  Result=Multiply(X,Result)+pCoefficient[i];
154  }
155  return Result;
156 }
float2 Cube(float2 Z)
float2 Conjugate(float2 Z)
float2 Divide(float2 Numerator, float2 Denominator)
float2 Square(float2 Z)
float2 Multiply(float2 LHS, float2 RHS)
float2 EvaluatePolynomial(float2 pCoefficient[POLYNOMIAL_DEGREE+1], float2 X)
float2 SquareRootUnsafe(float2 Z)
float Magnitude(float2 Z)
float2 Reciprocal(float2 Z)
float2 CubicRoot(float2 Z)
float2 SquareRoot(float2 Z)