gKit2 light
Toggle main menu visibility
Loading...
Searching...
No Matches
gkit2_tutos
M2
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
vec3
vecteur generique, utilitaire.
Definition
vec.h:169
Object
Definition
scene_tuto1.cpp:21
Generated on
for gKit2 light by
1.17.0