Revision a225e5aa
Added by Leszek Koltunski almost 8 years ago
src/main/java/org/distorted/library/EffectQueuePostprocess.java | ||
---|---|---|
43 | 43 |
|
44 | 44 |
class EffectQueuePostprocess extends EffectQueue |
45 | 45 |
{ |
46 |
private static final float GAUSSIAN[] = // G(0.00), G(0.03), G(0.06), ..., G(3.00) where G(x)= (1/(sqrt(2*PI))) * e^(-(x^2)/2)
|
|
47 |
{ |
|
46 |
private static final float GAUSSIAN[] = // G(0.00), G(0.03), G(0.06), ..., G(3.00), 0
|
|
47 |
{ // where G(x)= (1/(sqrt(2*PI))) * e^(-(x^2)/2). The last 0 terminates.
|
|
48 | 48 |
0.398948f, 0.398769f, 0.398231f, 0.397336f, 0.396086f, 0.394485f, 0.392537f, 0.390247f, 0.387622f, 0.384668f, |
49 | 49 |
0.381393f, 0.377806f, 0.373916f, 0.369733f, 0.365268f, 0.360532f, 0.355538f, 0.350297f, 0.344823f, 0.339129f, |
50 | 50 |
0.333229f, 0.327138f, 0.320868f, 0.314436f, 0.307856f, 0.301142f, 0.294309f, 0.287373f, 0.280348f, 0.273248f, |
... | ... | |
55 | 55 |
0.043984f, 0.041280f, 0.038707f, 0.036262f, 0.033941f, 0.031740f, 0.029655f, 0.027682f, 0.025817f, 0.024056f, |
56 | 56 |
0.022395f, 0.020830f, 0.019357f, 0.017971f, 0.016670f, 0.015450f, 0.014305f, 0.013234f, 0.012232f, 0.011295f, |
57 | 57 |
0.010421f, 0.009606f, 0.008847f, 0.008140f, 0.007483f, 0.006873f, 0.006307f, 0.005782f, 0.005296f, 0.004847f, |
58 |
0.004432f |
|
58 |
0.004432f, 0.000000f
|
|
59 | 59 |
}; |
60 |
private static final float NUM_GAUSSIAN = GAUSSIAN.length-1;
|
|
60 |
private static final int NUM_GAUSSIAN = GAUSSIAN.length-2;
|
|
61 | 61 |
|
62 | 62 |
private static final int MAX_BLUR = 50; |
63 | 63 |
|
... | ... | |
175 | 175 |
{ |
176 | 176 |
if( radius>=MAX_BLUR ) radius = MAX_BLUR-1; |
177 | 177 |
|
178 |
// Box Blur size 'radius' |
|
179 |
/* |
|
178 | 180 |
for(int i=0; i<=radius; i++) |
179 | 181 |
{ |
180 |
// Box Blur size 'radius' |
|
181 | 182 |
mWeights[i] = 1.0f / (2.0f*radius+1.0f); |
182 | 183 |
mOffsets[i] = i*height; |
184 |
} |
|
185 |
*/ |
|
186 |
// Gaussian Blur size 'radius' |
|
187 |
|
|
188 |
float P = (float)NUM_GAUSSIAN / (radius>3 ? radius:3); |
|
189 |
float x = 0.0f; |
|
190 |
mWeights[0] = GAUSSIAN[0]; |
|
191 |
mOffsets[0] = 0.0f; |
|
192 |
float sum = GAUSSIAN[0]; |
|
193 |
int j; |
|
194 |
float z; |
|
195 |
|
|
196 |
for(int i=1; i<=radius; i++) |
|
197 |
{ |
|
198 |
x += P; |
|
199 |
j = (int)x; |
|
200 |
z = x-j; |
|
183 | 201 |
|
184 |
// Gaussian Blur size 'radius' |
|
202 |
mWeights[i] = (1-z)*GAUSSIAN[j] + z*GAUSSIAN[j+1]; |
|
203 |
sum += 2*mWeights[i]; |
|
204 |
mOffsets[i] = i*height; |
|
205 |
} |
|
185 | 206 |
|
207 |
for(int i=0; i<=radius; i++) |
|
208 |
{ |
|
209 |
mWeights[i] /= sum; |
|
210 |
} |
|
186 | 211 |
|
212 |
// squash the weights and offsets for linear sampling |
|
213 |
int numloops = radius/2; |
|
214 |
|
|
215 |
for(int i=0; i<numloops; i++) |
|
216 |
{ |
|
217 |
mOffsets[i+1] = mWeights[2*i+1]*mOffsets[2*i+1] + mWeights[2*i+2]*mOffsets[2*i+2]; |
|
218 |
mWeights[i+1] = mWeights[2*i+1] + mWeights[2*i+2]; |
|
219 |
mOffsets[i+1] /= mWeights[i+1]; |
|
220 |
} |
|
221 |
|
|
222 |
if( radius%2 == 1 ) |
|
223 |
{ |
|
224 |
int index = radius/2 +1; |
|
225 |
mOffsets[index]=mOffsets[radius]; |
|
226 |
mWeights[index]=mWeights[radius]; |
|
227 |
radius = numloops+1; |
|
228 |
} |
|
229 |
else |
|
230 |
{ |
|
231 |
radius = numloops; |
|
187 | 232 |
} |
188 | 233 |
|
189 | 234 |
return radius; |
Also available in: Unified diff
Separable Gaussian Blur with linear sampling done.
Linear sampling implemented - i.e. blurring by a (2N+1)x(2N+1) gaussian kernel (centeral pixel + N pixels in each direction) requires exactly 2N + (N%2==1 ? 4:2) texture fetches.