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
_2DDrawing.fx
1 
4 void ComputeTextColor(out float4 OutFragmentColor,float4 FragmentColor,float4 TextColor=float4(1.0f,1.0f,1.0f,1.0f)){
5  OutFragmentColor.a=FragmentColor.r*TextColor.a;
6  OutFragmentColor.rgb=TextColor.rgb;
7 }
8 
12 void NormalizeSpriteSpacePosition(out float2 OutSpriteSpacePosition,float2 Position,float2 Divisor){
13  OutSpriteSpacePosition.x=Position.x/Divisor.x;
14  OutSpriteSpacePosition.y=Position.y/Divisor.y;
15 }
16 
19 void ComputeInverseTranslation(out float2 OutInverseTranslation,float2 Translation){
20  OutInverseTranslation=-Translation;
21 }
22 
25 void Apply2DTranslation(out float2 OutTranslatedPosition,float2 Position,float2 Translation){
26  OutTranslatedPosition=Position+Translation;
27 }
28 
31 void Apply2DTransformation(out float2 OutTransformedPosition,float2 Position,float3x2 Transformation){
32  OutTransformedPosition=mul(float3(Position,1.0f),Transformation).xy;
33 }
34 
37 void Apply3DTransformation(out float4 OutTransformedPosition,float2 Position,float4x4 Transformation){
38  OutTransformedPosition=mul(float4(Position,0.0f,1.0f),Transformation);
39 }
40 
44 void Apply2DScalingAndTranslation(out float2 OutTransformedPosition,float2 Position,float4 ScalingAndTranslation){
45  OutTransformedPosition=Position.xy*ScalingAndTranslation.xy+ScalingAndTranslation.zw;
46 }
47 
48 
51 void ComputeSpriteToViewportSpace(out float3x2 OutSpriteToViewportSpace,float2 ViewportSpaceSpritePosition,float SpriteRotation,float2 SpriteSpaceCenter,float2 SpriteSize){
52  // Construct the rotation and scaling part
53  float RotationSin,RotationCos;
54  sincos(SpriteRotation,RotationSin,RotationCos);
55  OutSpriteToViewportSpace._11=RotationCos*SpriteSize.x;
56  OutSpriteToViewportSpace._12=-RotationSin*SpriteSize.x;
57  OutSpriteToViewportSpace._21=RotationSin*SpriteSize.y;
58  OutSpriteToViewportSpace._22=RotationCos*SpriteSize.y;
59  // Add the translation
60  float2 ViewportCenterOffest=mul(SpriteSpaceCenter,float2x2(OutSpriteToViewportSpace._11,OutSpriteToViewportSpace._12,OutSpriteToViewportSpace._21,OutSpriteToViewportSpace._22));
61  ViewportSpaceSpritePosition-=ViewportCenterOffest;
62  OutSpriteToViewportSpace._31=ViewportSpaceSpritePosition.x;
63  OutSpriteToViewportSpace._32=ViewportSpaceSpritePosition.y;
64 }
65 
66 
69 void ComputeViewportToProjectionSpace(out float3x4 OutViewportToProjectionSpace,float2 ViewportSize){
70  float2 InvViewportSize=float2(1.0f/ViewportSize.x,1.0f/ViewportSize.y);
71  OutViewportToProjectionSpace._11=2.0f*InvViewportSize.x;
72  OutViewportToProjectionSpace._12=0.0f;
73  OutViewportToProjectionSpace._13=0.0f;
74  OutViewportToProjectionSpace._14=0.0f;
75 
76  OutViewportToProjectionSpace._21=0.0f;
77  OutViewportToProjectionSpace._22=-2.0f*InvViewportSize.y;
78  OutViewportToProjectionSpace._23=0.0f;
79  OutViewportToProjectionSpace._24=0.0f;
80 
81  OutViewportToProjectionSpace._31=-1.0f;
82  OutViewportToProjectionSpace._32=1.0f;
83  OutViewportToProjectionSpace._33=0.0f;
84  OutViewportToProjectionSpace._34=1.0f;
85 }
86 
87 
91 void Apply2DProjectionSpaceTransform(out float4 OutProjectionSpacePosition,float2 ViewportSpacePosition,float3x4 ViewportToProjectionSpace){
92  OutProjectionSpacePosition=mul(float3(ViewportSpacePosition,1.0f),ViewportToProjectionSpace);
93 }
94 
95 
103 void ComputePlanarProjectionSpacePosition(out float4 OutProjectionSpacePosition,float2 Position){
104  OutProjectionSpacePosition=float4(2.0f*Position.x-1.0f,-2.0f*Position.y+1.0f,0.5f,1.0f);
105 }
106 
107 
114 void ComputeGraphPosition(out float2 OutPosition,float XCoordinate,float YCoordinate,float2 DomainTransform,float YOffset){
115  OutPosition=float2(XCoordinate*DomainTransform.x,YCoordinate*DomainTransform.y+YOffset);
116 }
117 
121  float XCoordinate;
123  float YCoordinate;
126 };
131 };
132 
144 void GenerateGraphQuad(inout TriangleStream<SGraphOutputVertex> OutTriangleStream,SGraphInputVertex pLineVertex[2],float2 DomainTransform,float2 Divisor,float3x2 SpriteToViewportSpace,float3x4 ViewportToProjectionSpace){
145  // Get to sprite space in pixels
146  float HalfLineWidth=pLineVertex[0].HalfLineWidth;
147  float2 pLineSpriteSpacePosition[2]={
148  float2(pLineVertex[0].XCoordinate,pLineVertex[0].YCoordinate)*DomainTransform,
149  float2(pLineVertex[1].XCoordinate,pLineVertex[1].YCoordinate)*DomainTransform
150  };
151  // Generate the triangle strip
152  float2 LineVector=pLineSpriteSpacePosition[1]-pLineSpriteSpacePosition[0];
153  float2 OrthonormalVector=normalize(float2(LineVector.y,-LineVector.x));
154  float2 pSpriteSpacePosition[4]={
155  pLineSpriteSpacePosition[0]-OrthonormalVector*HalfLineWidth,
156  pLineSpriteSpacePosition[0]+OrthonormalVector*HalfLineWidth,
157  pLineSpriteSpacePosition[1]-OrthonormalVector*HalfLineWidth,
158  pLineSpriteSpacePosition[1]+OrthonormalVector*HalfLineWidth
159  };
160  // Transform to projection space and generate the quad
161  [unroll] for(int i=0;i!=4;++i){
162  float2 SpriteSpacePosition=pSpriteSpacePosition[i];
163  // Go to normalized sprite space
164  float2 NormalizedSpriteSpacePosition=float2(SpriteSpacePosition.x/Divisor.x,SpriteSpacePosition.y/Divisor.y);
165  // Go to viewport space
166  float2 ViewportSpacePosition=mul(float3(NormalizedSpriteSpacePosition,1.0f),SpriteToViewportSpace);
167  // Go to projection space
168  float4 ProjectionSpacePosition=mul(float3(ViewportSpacePosition,1.0f),ViewportToProjectionSpace);
169  // Output the vertex
170  SGraphOutputVertex NewVertex;
171  NewVertex.ProjectionSpacePosition=ProjectionSpacePosition;
172  OutTriangleStream.Append(NewVertex);
173  }
174 }
float4 ProjectionSpacePosition
Definition: _2DDrawing.fx:130