Geometry shader per più primitivi


8

Come posso creare uno shader di geometria in grado di gestire più primitive? Ad esempio quando creo uno shader di geometria per triangoli, definisco un layout in questo modo:

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

Ma se uso questo shader, le linee o i punti non verranno visualizzati. Quindi aggiungendo:

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

Lo shader verrà compilato ed eseguito, ma renderà solo le linee (o qualunque sia l'ultima primitiva definita).

Quindi, come posso definire un singolo shader di geometria che gestirà più tipi di primitive? O non è possibile e devo creare più programmi shader e cambiare i programmi shader prima di disegnare ogni tipo?

Risposte:


7

Non credo che OpenGL supporti gli shader di geometria che producono più tipi di primitive. Sono davvero sorpreso che il tuo secondo blocco di codice sia stato compilato ... Forse ha appena sovrascritto la configurazione?

Dovrai creare più shader e passare da uno all'altro, almeno per triangoli / linee e punti. In realtà c'è un trucco che puoi fare con uno shader di frammenti per ricevere triangoli ma rendere solo le linee scartando frammenti che cadono troppo all'interno del triangolo in base a coordinate baricentriche. Per l'implementazione esatta di ciò, ti rimando al libro arancione OpenGL e alla sua sezione sugli shader di geometria e sul disegno di un wireframe (tornerò e modificherò dopo aver rintracciato il capitolo esatto).

Buona programmazione!


2

Non è possibile creare un programma con shader di geometria che gestiscono più tipi primitivi.

Detto questo, non devi fare molto lavoro per supportare più tipi primitivi. Grazie a ARB_separate_shader_objects , non è più hanno a collegare tutte le fasi di shader insieme. Puoi avere un solo programma vertice, un solo programma frammento e 2-3 programmi solo geometria che mescoli e abbini insieme. Finché usano interfacce compatibili, starai bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.