gKit2 light
indirect_cull.glsl
Go to the documentation of this file.
1 
3 
4 #version 430
5 
6 #ifdef COMPUTE_SHADER
7 
8 struct Object
9 {
10  vec3 pmin;
11  uint vertex_count;
12  vec3 pmax;
13  uint vertex_base;
14 };
15 
16 struct Draw
17 {
18  uint vertex_count;
19  uint instance_count;
20  uint vertex_base;
21  uint instance_base;
22 };
23 
24 layout(binding= 0, std430) readonly buffer objectData
25 {
26  Object objects[];
27 };
28 
29 layout(binding= 1, std430) writeonly buffer remapData
30 {
31  uint remap[];
32 };
33 
34 layout(binding= 2, std430) writeonly buffer paramData
35 {
36  Draw params[];
37 };
38 
39 layout(binding= 3) buffer counterData
40 {
41  uint count;
42 };
43 
44 
45 uniform vec3 bmin;
46 uniform vec3 bmax;
47 
48 
49 layout(local_size_x= 256) in;
50 void main( )
51 {
52  uint id= gl_GlobalInvocationID.x;
53  if(id >= objects.length())
54  return;
55 
56  // recupere la bbox du ieme objet...
57  vec3 pmin= objects[id].pmin;
58  vec3 pmax= objects[id].pmax;
59 
60  // test d'inclusion avec la bbox...
61  if(any(lessThan(pmax, bmin)) // trop a gauche pour x, etc
62  || any(greaterThan(pmin, bmax))) // trop a droite pour x, etc
63  // pas d'intersection...
64  return;
65 
66  // bvec3 lessThan( vec3 a, vec3 b ) : compare les vecteurs composante par composante et renvoie un vecteur de bool.
67  // bvec3 greaterThan( vec3 a, vec3 b ) : idem.
68  // bool any( bvec3 ) : renvoie vrai si une des composantes du vecteur est vraie.
69 
70  // l'objet est dans la bbox, il faut le dessiner : emettre les parametres du draw
71  // etape 1 : position dans le buffer de sortie
72  uint index= atomicAdd(count, 1);
73  // remarque : peut mieux faire, utiliser une hierarchie de compteurs atomiques, 1 par sous groupe, 1 par groupe, 1 global
74  // cf le principe et la solution AMD https://gpuopen.com/fast-compaction-with-mbcnt/
75  // cf equivalent nvidia https://developer.nvidia.com/reading-between-threads-shader-intrinsics
76 
77  // etape 2 : initialiser les parametres
78  params[index].vertex_count= objects[id].vertex_count;
79  params[index].instance_count= 1;
80  params[index].vertex_base= objects[id].vertex_base;
81  params[index].instance_base= 0;
82 
83  // etape 3 : conserve aussi l'indice de l'objet...
84  remap[index]= id;
85 }
86 
87 #endif
vecteur generique, utilitaire.
Definition: vec.h:146