2015-08-29 24 views
5

In entrambe le condutture di rendering OpenGL e Direct3D, lo shader della geometria viene elaborato dopo il vertex shader e prima dello shader di frammento/pixel. Ora ovviamente elaborando lo shader della geometria dopo che il frammento/pixel shader non ha senso, ma quello che mi chiedo è perché non metterlo prima del vertex shader?Perché lo shader della geometria viene elaborato dopo il vertex shader?

Da un punto di vista software/di alto livello, almeno sembra avere più senso in questo modo: prima si esegue lo shader della geometria per creare tutti i vertici desiderati (e si esegue il dump di tutti i dati rilevanti per lo shader della geometria) , quindi esegui il vertex shader su tutti i vertici così creati. C'è un ovvio inconveniente nel fatto che il vertex shader deve ora essere eseguito su ciascuno dei vertici appena creati, ma qualsiasi logica che deve essere eseguita lì, nelle condotte attuali, deve essere eseguita per ogni vertice nello shader della geometria presumibilmente; quindi non c'è molto di un colpo di prestazioni lì.

Suppongo, dal momento che lo shader della geometria si trova in questa posizione in entrambe le condotte, che c'è un motivo hardware o un motivo di pipeline non ovvio che abbia più senso.

(Sono consapevole del fatto che il collegamento di poligoni deve aver luogo prima di eseguire uno shader di geometria (probabilmente non se prende punti singoli come input?) Ma so anche che deve essere eseguito dopo lo shader di geometria, quindi non lo farebbe Ha ancora senso eseguire il vertex shader tra quelle fasi?)

risposta

4

Fondamentalmente perché "geometry shader" è stata una scelta piuttosto stupida di parole da parte di Microsoft. Dovrebbe essere chiamato "shader primitivo".

Gli shader di geometria rendono programmabile la fase di assemblaggio primitiva e non è possibile assemblare le primitive prima di avere un flusso di input di vertici calcolato. C'è una certa sovrapposizione di funzionalità poiché si può prendere un tipo di input primitivo e sputare un tipo completamente diverso (spesso richiede il calcolo di vertici extra).

Questi vertici emessi in più non richiedono un ritorno all'indietro nella pipeline allo stadio del vertex shader: vengono calcolati completamente durante l'invocazione dello shader della geometria. Questo concetto non dovrebbe essere troppo estraneo, perché i controlli di tessellation e gli shader di valutazione assomigliano molto anche ai vertex shaders nella forma e nella funzione.

Ci sono molti stadi di trasformazione dei vertici e quelli che chiamiamo vertex shader sono solo la punta dell'iceberg. In un'applicazione moderna ci si può aspettare che l'output di un vertex shader passi attraverso più fasi aggiuntive prima di avere un vertice finalizzato per la rasterizzazione e l'ombreggiatura dei pixel (anch'essa mal definita).

+1

Se ti piace il nome o meno, il problema con _primitive shader_ è che l'abbreviazione '' PS'' sarebbe ambigua con _pixel shader_. '' GS'' (geometria shader) è almeno distinto da '' PS'' (pixel shader), '' VS'' (vertex shader), '' HS'' (shader shader), '' DS'' (domain shader), e '' CS'' (shader di calcolo). –

+2

@ChuckWalbourn: Sì, il che mi riporta alla mia conclusione .. se avessero chiamato gli shader dei frammenti di Pixel Shader saremmo stati molto meglio. OpenGL ha una proprietà davvero piacevole che ogni fase shader prende il nome dai dati che emette (ad eccezione di Geometry Shader, ma stavano seguendo il comando di Microsoft). D3D nomina alcuni shader dopo il loro output, alcuni dopo il loro input, altri non descrittivamente. –