2013-09-06 15 views
5

Ho una domanda riguardante gli shader di elaborazione. sono gli shader computazionali disponibili in DX 9? sarebbe ancora possibile utilizzare uno shader di calcolo con un driver DX9 se non c'è alcun frammento shader di calcolo sulla GPU? (SGX 545 non ce l'ha, ma la generazione SGX 6X lo avrà), per quanto riguarda ciò che dice IMG. Mi piacerebbe sapere se posso fare qualche semplice programmazione generica sulle GPU SGX con driver DirectX9 o OpenGL.Calcolo per scopi generici con ombreggiatori Vertex/Pixel (Open GL/DirectX)

Inoltre, è comunque possibile utilizzare i vertex shader di OpenGL per la programmazione GPGPU? Ecco cosa sto pensando: Caricherò le mie matrici/dati nel buffer dei vertici e li collegherò al contesto del programma. Caricherò altre variabili statiche nelle variabili uniformi e il mio programma di calcolo effettivo in vertex shader. Fino a questo punto sembra fattibile (vero?), Ma l'output dal vertex shader passerà attraverso la rasterizzazione e verrà inviato a framment shader (in base a come vanno le cose in openGL). Posso comunque impedire che i dati passino attraverso tutta la pipeline grafica, o posso intercettare dopo che vertex shader è stato eseguito con l'esecuzione, e in qualche modo leggere i valori e il tempo impiegato per l'esecuzione?

risposta

3

c'è comunque possibile utilizzare i vertex shader di OpenGL per la programmazione GPGPU?

La parte che esce dal vertex shader viene generalmente interpolata in fase di raserizzazione. Nelle vecchie versioni di openGL è possibile specificare se tale interpolazione dovrebbe o non dovrebbe accadere per variabili specifiche. Non so se puoi ancora farlo ... Sì, puoi ancora (grazie a datenwolf per il suggerimento) ... ma un approccio migliore, secondo me, è usare gli shader dei frammenti. Esegui il rendering su un frame completo, utilizzando un semplice verder shader che esegue il rendering di due triangoli che coprono l'intero fotogramma (un quadruplo), come per qualsiasi effetto di post process, e esegui il calcolo nello shader del frammento. Inserisci i dati che vuoi utilizzare come input nelle trame e rendi i tuoi risultati ad altre texture usando gli oggetti frame buffer (FBO).

+2

Sono molto affezionato a questo approccio me stesso, perché permette di avere un sacco di roba GPGPU in contesti davvero inaspettati (vale a dire _WebGL_). Se riesci a strutturare il tuo algoritmo in modo che funzioni bene in implementazioni che non supportano gli obiettivi di rendering a virgola mobile, ti sorprenderebbe sapere quanti dispositivi sono in grado di utilizzare GPGPU. Dal momento che il feedback sulla trasformazione non è possibile in OpenGL ES 2.0, penso che l'unico modo per affrontarlo in maniera portabile sia usare lo stadio vertex shader come un semplice passthrough come hai detto tu e fare il lavoro in un framment shader. –

+2

Bene, c'è uno svantaggio usando lo stato del frammento per i calcoli: non consente di eseguire scritture scatter, che possono essere un problema per alcuni algoritmi.A seconda di cosa si vuole realmente fare, è possibile utilizzare la fase di vertex shader per eseguire calcoli "dispersione", che emette la posizione dei punti di pixel singoli e hanno lo shader frammento eseguire compuations localizzate. – datenwolf

+0

@darius: E 'ancora possibile girare di interpolazione per varyings selezionati. – datenwolf

3

C'è qualche cosa che può impedire i dati per essere passare attraverso tutta del pipleline grafica, o posso intercettare dopo vertex shader è fatto con l'esecuzione, e in qualche modo leggere i valori ei tempi di esecuzione?

Sì.
Potenzialmente è possibile utilizzare il vertex shader per i calcoli, disattivare gli stage di tessellation e lo shader di geometria e intercettare i risultati del feedback di trasformazione.

Di seguito è il OpenGL Rendering Pipeline.

Le fasi facoltative hanno un bordo a strisce.
Gli stadi programmabili sono blu.

OpenGL Rendering Pipeline

+1

In effetti, è possibile probabilmente la rasterizzazione della scorciatoia semplicemente impostando la coordinata W di ogni vertice su 0.0. In teoria, la divisione prospettica causerebbe il ritaglio di ognuno di questi vertici. Naturalmente se si voleva utilizzare W per qualcosa di significativo sei fuori di fortuna :) E questo non risolve il dilemma OpenGL ES, purtroppo, come ES e ES 2.0 non hanno trasformare feedback. –

+0

@DylanHolmes: Grazie mille. quindi intendi dire che posso spegnere anche il pixel shader? c'è un modo per leggere i dati dal feed back di trasformazione? Esiste qualche tutorial o qualche programma di esempio di materiale disponibile che potrebbe aiutarmi a iniziare? Sono un principiante in OpenGL. –

+0

È possibile "disattivare" il pixel shader impostando la coordinata w di ogni vertice su 0, come in precedenza @ AndonM.Coleman. Un ottimo tutorial per iniziare sarebbe http://www.opengl-tutorial.org/ –