2017-07-04 4 views
0

Comment il est possible de transmettre des données via des shaders, en utilisant vertex, tess. contrôle, tess. évaluation, géométrie et fragmentation des shaders. J'ai essayé d'utiliser un bloc d'interface de cette façon.Transmettre des données via des shaders

//vertex shaders 
out VS_OUT { ... } vs_out; 

Que j'ai écrit ce code dans shader contrôle tessellation:

in VS_OUT { ... } tc_in; 
out TC_OUT { ... } tc_out; 

Ainsi, shaders de contrôle de tesselation appelé une fois pour chaque sommet. Cela signifie-t-il que tc_in ne doit pas être un tableau mais une variable unique. Je ne suis pas vraiment sûr de ça à cause de gl_InvocationID.

Alors les choses deviennent difficiles. Nuancier d'évaluation de Tessellation. Quelque chose me dit que shader d'évaluation devrait prendre le bloc d'interface en tant que tableau.

in TC_OUT { ... } te_in[]; 
out TE_OUT { ... } te_out[]; 

Déplacement vers un shader de géométrie. Geometry shader prend plusieurs sommets, donc, certainement un bloc d'interface de tableau.

in TE_OUT { ... } gs_in[]; 
out vec3 random_variable; 
... 
random_variable = gs_in[whatever_index]; 

Semble légitime pour moi, mais les données ne sont pas venus à fragment shader.

J'apprécierais n'importe quel conseil.

Répondre

2

shaders de contrôle de Tessellation prennent les sommets d'un patch les modifier en quelque sorte, de sorte que leur entrée et la sortie est

in VS_OUT { ... } tc_in[]; 
out TC_OUT { ... } tc_out[]; 

Le shader de commande est appelée pour chaque sommet de patch (voir lequel à l'aide gl_InvocationID) , donc vous n'avez généralement pas besoin de boucles pour l'implémenter.

Shaders évaluation de Tessellation prendre ces sommets modifiés et la sortie d'un nous avons seul sommet par invocation, ainsi

in TC_OUT { ... } te_in[]; 
out TE_OUT { ... } te_out; 

shaders de géométrie prennent de multiples sommets et peut émettre un nombre différent de sommets, mais ceux-ci sont construits explicitement en utilisant EmitVertex et EmitPrimitive, donc il n'y a qu'un seul élément de sortie qui doit être rempli avant chaque appel de EmitVertex:

in TE_OUT { ... } gs_in[]; 
out GS_OUT { ... } gs_out; 

Mais n'oubliez pas de mettre glPosition dans votre geometry shader, sinon OpenGL ne saura pas où placer vos vertices.

Les valeurs interpolées de gs_out sont ensuite transmises au fragment shader.

+0

Merci beaucoup! Tu as beaucoup aidé! – Peter

+0

Heureux d'être utile. Si vous voulez des exemples, quand j'ai utilisé les shaders de tessellation, [cet article] (http://prideout.net/blog/?p=48) m'a aidé à comprendre les concepts et la mise en œuvre. –