gKit2 light
Loading...
Searching...
No Matches
indirect_cull.glsl
Go to the documentation of this file.
1
3
4#version 430
5
6#ifdef COMPUTE_SHADER
7
8struct Object
9{
10 vec3 pmin;
11 uint vertex_count;
12 vec3 pmax;
13 uint vertex_base;
14};
15
16struct Draw
17{
18 uint vertex_count;
19 uint instance_count;
20 uint vertex_base;
21 uint instance_base;
22};
23
24layout(binding= 0, std430) readonly buffer objectData
25{
26 Object objects[];
27};
28
29layout(binding= 1, std430) writeonly buffer remapData
30{
31 uint remap[];
32};
33
34layout(binding= 2, std430) writeonly buffer paramData
35{
36 Draw params[];
37};
38
39layout(binding= 3) buffer counterData
40{
41 uint count;
42};
43
44
45uniform vec3 bmin;
46uniform vec3 bmax;
47
48
49layout(local_size_x= 256) in;
50void 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:169