2010-10-12 16 views
12

È possibile utilizzare lo shader per calcolare alcuni valori e quindi restituirli per un ulteriore utilizzo?Utilizzo dello shader per i calcoli

Ad esempio, invio mesh alla GPU, con alcuni parametri su come dovrebbe essere modificato (cambiare la posizione dei vertici) e riprendere la mesh risultante? Lo vedo piuttosto impossibile perché non ho visto alcuna variabile per la comunicazione dagli shader alla CPU. Sto usando GLSL quindi ci sono solo uniformi, attributi e varianti. Dovrei usare l'attributo o l'uniforme, sarebbero ancora validi dopo il rendering? Posso cambiare i valori di queste variabili e leggerle nella CPU? Esistono metodi per mappare i dati in GPU, ma quelli saranno modificati e validi?

Questo è il modo in cui sto pensando a questo, anche se potrebbe esserci un altro modo, che per me non è noto. Sarei felice se qualcuno potesse spiegarmi questo, dato che ho appena letto alcuni libri su GLSL e ora mi piacerebbe programmare shader più complessi, e non mi piacerebbe alleviare metodi che sono impossibili in questo momento.

Grazie

risposta

6

Ottima domanda! Benvenuti nel nuovo mondo del General Purpose Computing su unità di elaborazione grafica (GPGPU).

Quello che vuoi fare è possibile con pixel shader. Si carica una trama (ovvero: dati), si applica uno shader (per eseguire il calcolo desiderato) e quindi si utilizza Render to Texture per passare i dati risultanti dalla GPU alla memoria principale (RAM).

ci sono strumenti creati per questo scopo, in particolare OpenCL e CUDA. Aiutano enormemente GPGPU in modo che questo tipo di programmazione assomigli quasi alla programmazione della CPU.

Non richiedono alcuna esperienza di grafica 3D (sebbene sia ancora preferibile :)). Non è necessario fare trucchi con le trame, basta caricare gli array nella memoria della GPU. Gli algoritmi di elaborazione sono scritti in una versione leggermente modificata di C. L'ultima versione di CUDA supporta C++.

vi consiglio di iniziare con CUDA, dal momento che è il più maturo: http://www.nvidia.com/object/cuda_home_new.html

+0

Come testalino ha scritto, CUDA è specifico per nVidia. Poiché sto eseguendo Radeon, non dovrei soffrire di rallentamenti, o è addirittura possibile eseguire CUDA su Radeon? OpenCL è meno efficace o perché non lo si consiglia di utilizzare come prima? – Raven

+0

@Raven Sì, CUDA è completamente specifico per nVidia.Se dovessi scegliere preferirei CUDA + nVidia. Dato che hai ATI devi scegliere OpenCL. Per quanto ne so, CUDA è più maturo, gli strumenti sono migliori, ecc. In termini di prestazioni, non credo che ci sia una differenza significativa. – Andrey

+0

@Raven, sceglierei Direct Compute se stavo già usando Direct X, Open CL se stavo usando Open GL. Non userei mai CUDA per la ragione dichiarata. Non è possibile assicurarsi che tutti quelli che utilizzano la propria applicazione abbiano una scheda NVIDIA. – testalino

0

La mia ipotesi migliore sarebbe quella di inviare a BehaveRT che è una libreria creata per sfruttare le GPU per i modelli Behavorial. Penso che se puoi formulare le tue modifiche nella libreria, potresti trarre vantaggio dalla sua astrazione

Circa i dati che passano avanti e indietro tra la tua CPU e GPU, ti lascio sfogliare la documentazione, non sono sicuro a questo proposito

2

Questo è facilmente possibile su schede grafiche moderne che utilizzano Open CL, Microsoft Direct Compute (parte di DirectX 11) o CUDA. Vengono utilizzati i normali linguaggi shader (GLSL, HLSL per esempio). I primi due lavori su entrambe le schede grafiche Nvidia e ATI, cuda sono esclusivamente nvidia.

Queste sono librerie speciali per l'elaborazione di materiale sulla scheda grafica. Non userei una normale API 3D per questo, anche se è possibile con alcuni soluzioni alternative.

1

Ora è possibile utilizzare gli oggetti di buffer shader in OpenGL per scrivere i valori in shader che possono essere letti in host.

Problemi correlati