2012-01-18 27 views
5

Sto provando a creare un vertex wireframe/framment shader in Unity. Sembra possibile secondo lo this paper. Le idee generali sembrano essere che si passa un vettore di distanza calcolato nel vertex shader a ciascun frammento nello shader di frammenti, che può essere utilizzato per determinare quale luminosità disegnare la linea wireframe in base alla sua posizione all'interno di un poligono.È possibile accedere a tutti i vertici in un poligono in uno shader di vertici?

Da tutto ciò che ho letto, tuttavia, sembra che si abbia accesso a un singolo vertice in uno shader di vertici. Avrei bisogno di accedere a tutti i vertici vicini in un poligono per il vertice di ecah. Il documento sembra implicare che uno shader di geometria non è necessario, il che è positivo perché Unity non li supporta ancora.

Cosa mi manca? Non è mai possibile accedere ai vertici vicini in uno shader di vertici? Quello che sto cercando di fare è impossibile senza geometri shader?

risposta

2

Lei sembra avere davvero over-leggere il paragrafo in 2.1 che dice

Fase G1 è generalmente sempre eseguita nel vertex shader. Il passaggio G2 deve essere eseguito nello shader della geometria poiché lo shader di geometria ha accesso a tutti i vertici del poligono (purché si tratti di un triangolo). Di conseguenza, se lo shader della geometria non viene utilizzato, lo shader di vertici deve ricevere gli altri vertici come attributi per calcolare le distanze . Ciò implica che il codice dell'applicazione non è invariante se viene utilizzato il metodo wireframe, che i dati aggiuntivi devono essere trasmessi a e, infine, che l'uso di primitive indicizzate è precluso poiché gli attributi di un vertice dipendono da quale triangolo è disegnato .

Quindi, quando non si usa lo shader di geometria, in effetti non si conoscono gli altri vertici di un triangolo e quindi devono trasmetterli come attributi di vertici aggiuntivi. Quindi per ogni vertice di un triangolo hai due attributi vec3 aggiuntivi contenenti le posizioni degli altri due vertici di questo triangolo. E, naturalmente, come dice il testo, non è possibile utilizzare il disegno indicizzato, poiché questi due attributi non dipendono solo dalla posizione del vertice, ma anche dal triangolo a cui appartiene questo vertice.

+0

Grazie per il vostro aiuto. Sai se questi vincoli sono qualcosa che può essere superato all'interno del motore Unity? È possibile passare queste informazioni extra in uno shader Cg come quelle che usa Unity? Da dove verrà eseguita questa transizione? – aardvarkk

+0

@aardvarkk Questi vincoli non possono essere superati poiché sono vincoli dell'hardware/dell'interfaccia sottostante e non del motore o del linguaggio di ombreggiatura. Un vertex shader ha solo accesso a un singolo vertice e devi dare gli altri due come attributi di questo vertice. Non ho alcuna esperienza con Unity, ma Cg ha ovviamente attributi per-vertice e sono sicuro che Unity ha alcuni mezzi per fornire gli attributi personalizzati dei vertici del tuo modello. –

+0

@aardvarkk Quindi hai altre domande sulla tua domanda originale (se puoi accedere ai vicini in VS e se il tuo obiettivo è impossibile senza GS)? Non otterrete risposte diverse da chiunque comprenda i vertex e gli shaders geometrici. L'unità non ha nulla a che fare con esso, in quanto non può superare magicamente i limiti dell'hardware grafico sottostante. –