@@ -29,73 +29,197 @@ float3 DecodeNormal(float4 enc)
29
29
// Percentage Closer Filtering variations //
30
30
//////////////////////////////////////////////
31
31
32
- float PCF3x3 (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
32
+ float PCF2x2Poisson (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
33
+ {
34
+ float2 poissonDisk[4 ] =
35
+ {
36
+ float2 (-0.94201624 , -0.39906216 ),
37
+ float2 (0.94558609 , -0.76890725 ),
38
+ float2 (-0.094184101 , -0.92938870 ),
39
+ float2 (0.34495938 , 0.29387760 )
40
+ };
41
+ float percentLit = 0.f ;
42
+
43
+ for (int i = 0 ; i < 4 ; i++)
44
+ {
45
+ bool isLit =
46
+ tex2D (
47
+ shadowMap,
48
+ texCoord +
49
+ poissonDisk[i] * oneOverShadowMapSize
50
+ ).r > depthCompare;
51
+ percentLit += isLit * 0.25f ;
52
+ }
53
+
54
+ return percentLit;
55
+ }
56
+
57
+ float PCF3x3Poisson (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
58
+ {
59
+ float2 poissonDisk[9 ] =
60
+ {
61
+ float2 (0.4677864f , 1.0492188f ),
62
+ float2 (0.8965628f , -0.3094058f ),
63
+ float2 (-0.3828112f , 1.6226606f ),
64
+ float2 (-0.214711f , -0.7530054f ),
65
+ float2 (-0.6589904f , 0.4324332f ),
66
+ float2 (1.480888f , 1.2347982f ),
67
+ float2 (1.9457676f , -0.13916496f ),
68
+ float2 (1.1015856f , -1.5681816f ),
69
+ float2 (0.06198422f , -1.7864658f )
70
+ };
71
+ float percentLit = 0.f ;
72
+
73
+ for (int i = 0 ; i < 9 ; i++)
74
+ {
75
+ bool isLit =
76
+ tex2D (
77
+ shadowMap,
78
+ texCoord +
79
+ poissonDisk[i] * oneOverShadowMapSize
80
+ ).r > depthCompare;
81
+ percentLit += isLit * 0.1111111f ;
82
+ }
83
+
84
+ return percentLit;
85
+ }
86
+
87
+ float PCF12TapPoisson (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
33
88
{
89
+ float2 poissonDisk[12 ] =
90
+ {
91
+ float2 (-0.5946302f , 0.6008242f ),
92
+ float2 (-1.762928f , 0.5199542f ),
93
+ float2 (-1.56506f , -0.8692048f ),
94
+ float2 (0.14760224f , 1.7710094f ),
95
+ float2 (0.7065646f , 0.04265878f ),
96
+ float2 (-0.5888886f , -0.429245f ),
97
+ float2 (1.024129f , 1.1201256f ),
98
+ float2 (-1.118836f , 1.6018892f ),
99
+ float2 (-0.9557046f , -1.7215218f ),
100
+ float2 (0.02812326f , -1.4003752f ),
101
+ float2 (1.6575236f , -0.287287f ),
102
+ float2 (1.3867802f , -1.375697f )
103
+ };
34
104
float percentLit = 0.f ;
105
+
106
+ for (int i = 0 ; i < 12 ; i++)
107
+ {
108
+ bool isLit =
109
+ tex2D (
110
+ shadowMap,
111
+ texCoord +
112
+ poissonDisk[i] * oneOverShadowMapSize
113
+ ).r > depthCompare;
114
+ percentLit += isLit * 0.0833333f ;
115
+ }
116
+
117
+ return percentLit;
118
+ }
119
+
120
+ float PCF4x4Poisson (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
121
+ {
122
+ float2 poissonDisk[16 ] =
123
+ {
124
+ float2 (2.688109f , 0.686785f ),
125
+ float2 (3.0212565f , -1.1432755f ),
126
+ float2 (1.9640215f , 1.5282315f ),
127
+ float2 (3.293479f , 1.5044285f ),
128
+ float2 (3.7991725f , 0.47122805f ),
129
+ float2 (1.211579f , 0.587791f ),
130
+ float2 (1.8459345f , -0.8353495f ),
131
+ float2 (4.1637455f , -0.639698f ),
132
+ float2 (2.3383775f , 2.6021615f ),
133
+ float2 (4.58543f , 1.3013345f ),
134
+ float2 (3.9300595f , 2.3949865f ),
135
+ float2 (3.537996f , 3.44172f ),
136
+ float2 (1.055484f , 2.1200395f ),
137
+ float2 (1.9478455f , 3.7591355f ),
138
+ float2 (1.0448675f , 3.2125375f ),
139
+ float2 (-0.25313345f , 2.309396f )
140
+ };
141
+ float percentLit = 0.f ;
142
+
143
+ for (int i = 0 ; i < 16 ; i++)
144
+ {
145
+ bool isLit =
146
+ tex2D (
147
+ shadowMap,
148
+ texCoord +
149
+ poissonDisk[i] * oneOverShadowMapSize
150
+ ).r > depthCompare;
151
+ percentLit += isLit * 0.0625f ;
152
+ }
153
+
154
+ return percentLit;
155
+ }
156
+
157
+ float PCF3x3Dithered (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
158
+ {
159
+ // use modulo to vary the sample pattern
160
+ float2 offset = floor (texCoord.xy) % 3.0 ;
35
161
162
+ float percentLit = 0.f ;
36
163
for (int x = -1 ; x <= 1 ; x++)
37
164
for (int y = -1 ; y <= 1 ; y++)
38
165
{
39
166
bool isLit =
40
167
tex2D (
41
168
shadowMap,
42
169
texCoord +
43
- float2 (x * oneOverShadowMapSize.x, y * oneOverShadowMapSize.y)
170
+ float2 (x, y) * oneOverShadowMapSize +
171
+ offset
44
172
).r > depthCompare;
45
173
percentLit += isLit;
46
174
}
47
175
48
176
return percentLit * 0.111111f ;
49
177
}
50
178
51
- float PCF4x4Poisson (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
179
+ float PCF5x5Dithered (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
52
180
{
53
- float2 poissonDisk[4 ] =
54
- {
55
- float2 ( -0.94201624 , -0.39906216 ),
56
- float2 ( 0.94558609 , -0.76890725 ),
57
- float2 ( -0.094184101 , -0.92938870 ),
58
- float2 ( 0.34495938 , 0.29387760 )
59
- };
60
- float percentLit = 0.f ;
181
+ // use modulo to vary the sample pattern
182
+ float2 offset = floor (texCoord.xy) % 5.0 ;
61
183
62
- for (int i = 0 ; i < 4 ; i++)
63
- {
64
- bool isLit =
65
- tex2D (
66
- shadowMap,
67
- texCoord +
68
- poissonDisk[i] * oneOverShadowMapSize
69
- ).r > depthCompare;
70
- percentLit += isLit * 0.2f ;
71
- }
184
+ float percentLit = 0.f ;
185
+ for (int x = -2 ; x <= 2 ; x++)
186
+ for (int y = -2 ; y <= 2 ; y++)
187
+ {
188
+ bool isLit =
189
+ tex2D (
190
+ shadowMap,
191
+ texCoord +
192
+ float2 (x, y) * oneOverShadowMapSize +
193
+ offset
194
+ ).r > depthCompare;
195
+ percentLit += isLit;
196
+ }
72
197
73
- return percentLit;
198
+ return percentLit * 0.04f ;
74
199
}
75
200
76
- float PCF4x4Dithered (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
201
+ float PCF8x8Dithered (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
77
202
{
78
203
// use modulo to vary the sample pattern
79
- float2 offset = floor (texCoord.xy) % 2 .0 ;
204
+ float2 offset = floor (texCoord.xy) % 8 .0 ;
80
205
81
- float percentLit = 0.f ;
82
- percentLit += tex2D (shadowMap, texCoord + (float2 (-1.5 , 1.5 ) + offset) * oneOverShadowMapSize).r > depthCompare;
83
- percentLit += tex2D (shadowMap, texCoord + (float2 (0.5 , 1.5 ) + offset) * oneOverShadowMapSize).r > depthCompare;
84
- percentLit += tex2D (shadowMap, texCoord + (float2 (-1.5 , -0.5 ) + offset) * oneOverShadowMapSize).r > depthCompare;
85
- percentLit += tex2D (shadowMap, texCoord + (float2 (0.5 , -0.5 ) + offset) * oneOverShadowMapSize).r > depthCompare;
86
-
87
- return percentLit * 0.25 ;
206
+ float x, y, percentLit = 0.f ;
207
+ for (y = -3.5f ; y <= 3.5f ; y += 1.0f )
208
+ for (x = -3.5f ; x <= 3.5f ; x += 1.0f )
209
+ percentLit += tex2D (shadowMap, texCoord + float2 (x, y) * oneOverShadowMapSize + offset).r > depthCompare;
210
+
211
+ return percentLit * 0.015625f ;
88
212
}
89
213
90
214
float PCF5x5Gaussian (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
91
215
{
92
216
const float GaussianKernel[5 ][5 ] =
93
217
{
94
- 0.00296901674395065 , 0.013306209891014005 , 0.02193823127971504 , 0.013306209891014005 , 0.00296901674395065 ,
95
- 0.013306209891014005 , 0.05963429543618023 , 0.09832033134884507 , 0.05963429543618023 , 0.013306209891014005 ,
96
- 0.02193823127971504 , 0.09832033134884507 , 0.16210282163712417 , 0.09832033134884507 , 0.02193823127971504 ,
97
- 0.013306209891014005 , 0.05963429543618023 , 0.09832033134884507 , 0.05963429543618023 , 0.013306209891014005 ,
98
- 0.00296901674395065 , 0.013306209891014005 , 0.02193823127971504 , 0.013306209891014005 , 0.00296901674395065
218
+ 0.00296901674395065f , 0.013306209891014005f , 0.02193823127971504f , 0.013306209891014005f , 0.00296901674395065f ,
219
+ 0.013306209891014005f , 0.05963429543618023f , 0.09832033134884507f , 0.05963429543618023f , 0.013306209891014005f ,
220
+ 0.02193823127971504f , 0.09832033134884507f , 0.16210282163712417f , 0.09832033134884507f , 0.02193823127971504f ,
221
+ 0.013306209891014005f , 0.05963429543618023f , 0.09832033134884507f , 0.05963429543618023f , 0.013306209891014005f ,
222
+ 0.00296901674395065f , 0.013306209891014005f , 0.02193823127971504f , 0.013306209891014005f , 0.00296901674395065f
99
223
};
100
224
float percentLit = 0.f ;
101
225
@@ -106,21 +230,40 @@ float PCF5x5Gaussian(sampler2D shadowMap, float2 oneOverShadowMapSize, float2 te
106
230
tex2D (
107
231
shadowMap,
108
232
texCoord +
109
- float2 (x * oneOverShadowMapSize.x , y * oneOverShadowMapSize.y)
233
+ float2 (x, y) * oneOverShadowMapSize
110
234
).r > depthCompare;
111
235
percentLit += isLit * GaussianKernel[x+2 ][y+2 ];
112
236
}
113
237
114
238
return percentLit;
115
239
}
116
240
241
+ float PCF3x3 (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
242
+ {
243
+ float percentLit = 0.f ;
244
+
245
+ for (int x = -1 ; x <= 1 ; x++)
246
+ for (int y = -1 ; y <= 1 ; y++)
247
+ {
248
+ bool isLit =
249
+ tex2D (
250
+ shadowMap,
251
+ texCoord +
252
+ float2 (x, y) * oneOverShadowMapSize
253
+ ).r > depthCompare;
254
+ percentLit += isLit;
255
+ }
256
+
257
+ return percentLit * 0.111111f ;
258
+ }
259
+
117
260
float PCF8x8 (sampler2D shadowMap, float2 oneOverShadowMapSize, float2 texCoord, float depthCompare)
118
261
{
119
- float x, y, percentLit = 0.f ;
120
- for (y = -3.5 ; y <=3.5 ; y+= 1.0 )
121
- for (x = -3.5 ; x <=3.5 ; x+= 1.0 )
262
+ float percentLit = 0.f ;
263
+ for (float y = -3.5f ; y <=3.5f ; y += 1.0f )
264
+ for (float x = -3.5f ; x <=3.5f ; x += 1.0f )
122
265
percentLit += tex2D (shadowMap, texCoord + float2 (x, y) * oneOverShadowMapSize).r > depthCompare;
123
266
124
- return percentLit / 64.0 ;
267
+ return percentLit * 0.015625f ;
125
268
}
126
269
////////////////////////////////////////////////////////////////
0 commit comments