Sombreador de geometria para várias primitivas

8

Como posso criar um sombreador de geometria que possa lidar com várias primitivas? Por exemplo, ao criar um sombreador de geometria para triângulos, defino um layout da seguinte forma:

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

Mas se eu usar esse shader, as linhas ou pontos não aparecerão. Então adicionando:

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

O sombreador será compilado e executado, mas renderizará apenas linhas (ou qualquer que seja a última primitiva definida).

Então, como defino um único sombreador de geometria que manipulará vários tipos de primitivas? Ou isso não é possível e eu preciso criar vários programas de sombreador e alterar programas de sombreador antes de desenhar cada tipo?

MichaelHouse
fonte

Respostas:

7

Não acredito que o OpenGL suporte shaders de geometria que produzem vários tipos de primitivas. Estou realmente surpreso que seu segundo bloco de código tenha sido compilado ... Talvez ele apenas substituiu a configuração?

Você terá que criar vários shaders e alternar entre eles, pelo menos para triângulos / linhas e pontos. Na verdade, há um truque que você pode fazer com um shader de fragmento para receber triângulos, mas renderiza apenas linhas descartando fragmentos que caem muito dentro do triângulo, de acordo com as coordenadas baricêntricas. Para a implementação exata disso, remeto-o ao OpenGL Orange Book e sua seção sobre sombreadores de geometria e desenho de uma estrutura de arame (voltarei a editar e depois de rastrear o capítulo exato).

Feliz codificação!

kevintodisco
fonte
2

Não é possível criar um programa com sombreadores de geometria que manipulem vários tipos primitivos.

Dito isto, você não precisa fazer muito trabalho para suportar vários tipos primitivos. Graças a ARB_separate_shader_objects , você não precisa mais vincular todos os estágios do shader. Você pode ter um programa somente de vértice, um programa somente de fragmento e 2-3 programas somente de geometria que misturam e combinam. Contanto que eles usem interfaces compatíveis, você ficará bem.

Nicol Bolas
fonte