Esiste un modo per generare primitive in uno shader di geometria senza alcuna geometria di input?


17

Alcuni anni fa ho provato a implementare questa gemma GPU in OpenGL per generare terreno procedurale 3D usando Marching Cubes . L'articolo suggerisce di implementare Marching Cubes in uno shader di geometria con la massima efficienza. Ciò significa che devo eseguire lo shader una volta per ogni voxel nel dominio e genererà l'intera geometria in quella cella.

Un problema su cui mi sono imbattuto è stato come far funzionare lo shader della geometria senza realmente avere nulla da renderizzare al di fuori di quello shader. La mia soluzione (che sembrava piuttosto confusa) era di rendere un punto in ogni cella, scartarlo con lo shader della geometria ed emettere invece i miei triangoli. Non ho mai trovato una soluzione adeguata e questa soluzione alternativa è rimasta nel codice finale.

Quindi, c'è comunque modo di dire a OpenGL di iniziare un passaggio di rendering dallo shader della geometria senza alcuna geometria di input? O dovrò sempre inviare alcuni punti fittizi alla GPU per far funzionare le cose.

Risposte:


15

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 glDrawArrayscon 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 .

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.