No, non c'è davvero un modo per farlo.
Un'invocazione dello shader della geometria richiede una primitiva di input e genera 0 o più primitive di output. Senza una primitiva di input, non esiste davvero un modo per invocare effettivamente lo shader della geometria . Ovviamente puoi allungare i limiti del numero massimo di primitive di output dello shader di geometria per ciascuna primitiva di input (non conosci i limiti pratici in questo momento, forse dovrebbe essere dell'ordine di migliaia). Quindi potresti generare 1024 triangoli per ogni punto, ma devi sempre avere delle primitive di input.
Ciò di cui non hai bisogno è una vera nozione di geometria. Non è necessario renderizzare i punti 3D in una posizione ragionevole, potrebbero anche avere solo un indice astratto o coordinate di trama o qualunque cosa come attributi e non necessariamente una posizione 3D significativa. Nessuno detta quali attributi hanno i tuoi vertici. E puoi persino eseguire il rendering dei vertici senza alcun attributo . Ma devi renderizzare alcune primitive per invocare lo shader della geometria su di loro, anche se quelle primitive non hanno alcun attributo reale (come però calcolare la geometria di output nello shader della geometria è una domanda diversa, però).
Ma quello che hai effettivamente fatto, rendendo un punto per ogni cella della griglia e generando i triangoli dei cubi in marcia per quella cella da essa, è esattamente l'approccio diretto. Ovviamente ciò che attribuisce questa cella dipende da te, potrebbe essere una posizione 3D, un texcoord in una trama 3D, qualunque cosa, ma quelle sono le celle della griglia che rendi. Detto in modo semantico, in realtà non "scarti" quei punti e poi li "sostituisci" con triangoli, "converti" ogni punto in un insieme di triangoli. Questo è esattamente lo scopo dello shader della geometria e non c'è nulla di "confuso" o "improprio" al riguardo. Nessuno dice che lo shader della geometria debba generare lo stesso tipo di primitiva di output che è stato inserito come "corretto" .
Quello che puoi fare per ottenere un modo in gran parte privo di input per rendere la tua griglia voxel (e questo potrebbe essere quello che stavi effettivamente chiedendo) sarebbe solo disegnare un insieme di punti senza attributi. Ciò significa che non è necessario alcun array di attributi e basta disabilitarli tutti e invocare un semplice glDrawArrays
con il numero di celle necessarie. Quindi nello shader di vertici o nello shader di geometria è possibile generare l'indice di cella della griglia 3D necessario con un po 'di magia dell'indice dall'ID del vertice di input (ovvero gl_VertexID
, che è l'unica informazione che hai) e quindi calcolare la geometria dei cubi in marcia da una ricerca in la trama del volume 3D (o qualunque struttura di dati).
Quindi, a posteriori, dovrei relativizzare la mia affermazione dall'inizio: non puoi generare primitive senza alcun input primitive , ma puoi generarle senza alcuna geometria di input .