gKit2 light
histogram.glsl
1 
2 // version finale
3 
4 #version 430
5 
6 #ifdef COMPUTE_SHADER
7 
8 layout(std430, binding= 0) coherent buffer HistogramData
9 {
10  int histogram[16];
11 };
12 
13 // image resultat
14 layout(binding= 0, rgba8) readonly uniform image2D image;
15 
16 shared int group_histogram[16];
17 
18 layout(local_size_x= 8, local_size_y= 8) in;
19 void main( )
20 {
21  uint ID= gl_LocalInvocationIndex;
22  if(ID < 16)
23  group_histogram[ID]= 0;
24 
25  // attend que tous les sous groupes s'executent
26  barrier();
27 
28  int local_histogram[16]= int[16](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
29 
30  for(int i= 0; i < 16; i++)
31  {
32  ivec2 offset= ivec2((i % 4), (i / 4));
33  vec4 pixel= imageLoad(image, ivec2(gl_WorkGroupID.xy)*32 + ivec2(gl_LocalInvocationID.xy) + offset*8);
34 
35  // calculer la cellule de l'histogramme pour le pixel
36  float grey= (pixel.r + pixel.g + pixel.b) / 3; // entre 0 et 1
37  int bin= int(grey * 15);
38 
39  local_histogram[bin]++;
40  }
41 
42  for(int i= 0; i < 16; i++)
43  if(local_histogram[i] > 0)
44  atomicAdd(group_histogram[i], local_histogram[i]);
45 
46  // attend que tous les sous groupes s'executent
47  barrier();
48 
49  if(ID < 16)
50  atomicAdd(histogram[ID], group_histogram[ID]);
51 }
52 
53 #endif
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition: vec.h:168