2012-11-20 21 views
5

Sono stato a questo tutto il giorno e sto iniziando a rinunciare a questo. Non riesco a trovare molte informazioni sugli shader computazionali. La fonte migliore era "Rendering e calcolo pratico con Direct3D 11" e sfortunatamente non è stato di grande aiuto. Mi ha aiutato a capire alcune teorie ma ancora non so come implementare nulla.Compute shaders, dove si inseriscono nella pipeline?

Sto lavorando a qualcosa di simile al sistema di particelle creato in quel libro. Tranne che il mio sistema particellare fondamentalmente ha solo particelle che vengono visualizzate in una griglia 3d (niente come gravità/forza/ecc.). Questo è per scopi didattici, se riesco a farlo funzionare sarei in grado di lavorare sul resto che presumo.

Quello che non capisco è come lo shader di elaborazione si inserisce nella pipeline. Penso di capire cosa devo fare, ma non so come dovrei farlo funzionare.

Ho bisogno di seminare lo shader di calcolo con un buffer pieno di tutte le posizioni delle particelle. (Dire, un buffer 1024x1024x1). Ho quindi bisogno di questo shader di calcolo per generare ogni posizione come vertice del mio vertex shader, e il resto della pipeline è standard dopo che (vertex shader fa tutte le trasformazioni, il mio shader di geometria espande il vertice verso un quad e il mio pixel lo shader lo rende).

Non so nemmeno se è giusto, ma sembra giusto. E anche se lo fosse, non ho idea di come farei per farlo. Come potrei alimentare l'output dello shader computato al vertex shader? Come inizializzare inizialmente lo shader di calcolo? Come posso garantire che lo shader di calcolo non scarti il ​​buffer di particelle? (altrimenti, dovrei fornire le particelle ogni volta, il che vanificherebbe lo scopo di (eventualmente) fare un sistema particellare con particelle che si spostano, ecc., come dovrei fare tutto ciò che sulla CPU)

Ci sono così tante incognite, e mi sembra che mi si aspetti che sappia tutto per iniziare a scrivere questi shader. Non riesco a trovare pietre miliari.

+0

Non si adatta direttamente al resto della pipeline, è una cosa indipendente. L'interfaccia utilizza molte delle stesse cose anche se per ovvi motivi. E i risultati e gli input sono lo stesso tipo di oggetti della scheda grafica utilizzati dalla pipeline, il che rende molto utile l'uso in combinazione con la pipeline. – jcoder

+0

Ho iniziato con gli shader dei computer creando uno semplice, indipendente da qualsiasi elemento grafico, che popola solo due buffer con matrici di numeri e crea uno shader di calcolo per generare un terzo che contenga la loro somma e rileggendolo alla CPU per stampare ... Puoi vedere come potresti estenderlo per aggiornare le posizioni di un carico di particelle - e quindi non ci sarebbe bisogno di leggere quelle posizioni nella CPU, un programma di pipeline grafica potrebbe usare i dati direttamente come input .. – jcoder

+0

Vorrei raccomandare qualcosa come questo libro http://www.amazon.co.uk/Introduction-Game-Programming-DirectX-ebook/dp/B0085CDJY4 in quanto contiene esattamente il tipo di esempi necessari. (Anche se a volte sembra non seguire alcuni passaggi, ho trovato un buon libro) – jcoder

risposta

3

Lo shader di calcolo non fa parte della linea grafica. È uno strumento facile per GPGPU, quindi puoi usare il computationpower del dispositivo grafico per scopi non di rendering, come il particlemovement, in un modo più semplice. Se vuoi usarlo per il tuo sistema di particelle, devi calcolare prima le posizioni delle particelle con uno shader di calcolo. Quindi inserisci l'output nel tuo codice normale in un vertexbuffer per il rendering. AFAIK non esiste un modo diretto per reindirizzare l'output alla renderpipeline, ma non è così familiare con gli shader computati. Link interessanti per voi sono forse lo documentation e lo example lì. La linea grafica è mostrata in questo page.