1 float4 get_pixel_color
(const __global float4
*in_buf
,
12 ix
= clamp
(ix, 0, rect_width-1
);
13 iy
= clamp
(iy, 0, rect_height-1
);
15 return in_buf
[iy
* rect_width
+ ix
];
18 __kernel void motion_blur_linear
(const __global float4
*src_buf
,
23 __global float4
*dst_buf
,
30 int gidx
= get_global_id
(0);
31 int gidy
= get_global_id
(1);
34 int px
= gidx
+ dst_x
;
35 int py
= gidy
+ dst_y
;
37 for
(int step
= 0; step < num_steps; ++step)
39 float t
= num_steps
== 1 ?
0.0f
:
40 step
/ (float)(num_steps -
1) -
0.5f
;
42 float xx
= px
+ t
* offset_x
;
43 float yy
= py
+ t
* offset_y
;
45 int ix
= (int)floor
(xx);
46 int iy
= (int)floor
(yy);
48 float dx
= xx - floor
(xx);
49 float dy
= yy - floor
(yy);
51 float4 mixy0
,mixy1
,pix0
,pix1
,pix2
,pix3
;
53 pix0
= get_pixel_color
(src_buf, src_width
,
54 src_height
, src_x
, src_y
, ix
, iy
);
55 pix1
= get_pixel_color
(src_buf, src_width
,
56 src_height
, src_x
, src_y
, ix
+1, iy
);
57 pix2
= get_pixel_color
(src_buf, src_width
,
58 src_height
, src_x
, src_y
, ix
, iy
+1);
59 pix3
= get_pixel_color
(src_buf, src_width
,
60 src_height
, src_x
, src_y
, ix
+1, iy
+1);
62 mixy0
= dy
* (pix2 - pix0
) + pix0
;
63 mixy1
= dy
* (pix3 - pix1
) + pix1
;
65 sum
+= dx
* (mixy1 - mixy0
) + mixy0
;
68 dst_buf
[gidy
* get_global_size
(0) + gidx
] =
69 sum
/ (float4)(num_steps);