Shader de géométrie pour plusieurs primitives

8

Comment puis-je créer un shader de géométrie capable de gérer plusieurs primitives? Par exemple, lors de la création d'un shader de géométrie pour des triangles, je définis une disposition comme ceci:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;

Mais si j'utilise ce shader, les lignes ou les points n'apparaîtront pas. Donc, en ajoutant:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
layout(lines) in;
layout(line_strip, max_vertices=2) out;

Le shader sera compilé et exécuté, mais ne rendra que les lignes (ou quelle que soit la dernière primitive définie).

Alors, comment puis-je définir un shader de géométrie unique qui gérera plusieurs types de primitives? Ou n'est-ce pas possible et je dois créer plusieurs programmes de shader et modifier les programmes de shader avant de dessiner chaque type?

MichaelHouse
la source

Réponses:

7

Je ne pense pas qu'OpenGL supporte les shaders de géométrie qui produisent plusieurs types de primitives. Je suis en fait surpris que votre deuxième bloc de code ait été compilé ... Peut-être qu'il a juste écrasé la configuration?

Vous devrez créer plusieurs shaders et basculer entre eux, au moins pour les triangles / lignes et les points. Il y a en fait une astuce que vous pouvez faire avec un shader de fragment pour recevoir des triangles, mais rendre uniquement les lignes en éliminant les fragments qui se trouvent trop à l'intérieur du triangle selon les coordonnées barycentriques. Pour l'implémentation exacte de cela, je vous renvoie à l'OpenGL Orange Book et à sa section sur les shaders de géométrie et le dessin d'un filaire (je reviendrai et éditerai après avoir retrouvé le chapitre exact).

Bon codage!

kevintodisco
la source
2

Il n'est pas possible de créer un programme avec des shaders de géométrie qui gèrent plusieurs types primitifs.

Cela étant dit, vous n'avez pas à faire beaucoup de travail pour prendre en charge plusieurs types primitifs. Grâce à ARB_separate_shader_objects , vous n'avez plus besoin de lier toutes vos étapes de shader. Vous pouvez avoir un programme de sommets uniquement, un programme de fragments uniquement et 2 à 3 programmes de géométrie uniquement que vous mélangez et associez ensemble. Tant qu'ils utilisent des interfaces compatibles, tout ira bien.

Nicol Bolas
la source