Domanda

Ho ottenuto un motore Voxel (base) in esecuzione e un sistema idrico che sembra (e presumo fondamentalmente funziona) come questo: https://www.youtube.com/watch?v=Q_tdegiooots (non il mio gioco).
. I valori dell'acqua sono memorizzati in una matrice 3D di galleggianti, e ogni 0,05 è calcola il flusso d'acqua controllando il voxel sottostante e adiacente (Y-1, X-1, X + 1, Z-1, Z + 1) e aggiunge il valore.
. Questo sistema funziona bene (70+ fps) per piccole quantità di acqua, ma quando inizio a calcolare l'acqua su 8+ pezzi, diventa troppo. (Ho disabilitato tutta la creazione di rendering o maglia per verificare se è il collo di bottiglia, non è. È puramente i calcoli del flusso).
. Non sono un programmatore molto esperto, quindi non avrei saputo dove iniziare a ottimizzare, oltre a rendere i calcoli accadendo in una coroutine come ho già fatto.
. In questo post: https://gamedev.stackexchange.com/questions/ 55414 / How-to-Definisci-Aree-piene-with-water (vicino al fondo) Boreal suggerisce di eseguirlo in un Shader di calcolo . È così il modo di andare per me? E come dovrei andare su una cosa del genere?
. Qualsiasi aiuto è molto apprezzato.

È stato utile?

Soluzione

Se stai davvero calcolando una simulazione basata su Voxel, si espanderai il numero di calcoli geometricamente come aumenta la tua dimensione, quindi esaurerai rapidamente la potenza di elaborazione su volumi più grandi.

Un shader di calcolo è ottimo per fare rapidamente calcoli paralleli in modo massiccio, sebbene sia un paradigma di programmazione molto diverso che ne prende un po 'di abituato. Un shader di calcolo guarderà il contenuto di un buffer (cioè, una "trama" per i civili statunitensi) e farà le cose molto rapidamente - nel tuo caso il buffer sarà probabilmente un buffer / texture i cui valori dei pixel rappresentano le cellule dell'acqua. Se vuoi fare qualcosa di veramente semplice come incrementarli su o giù per il calcolo Shader utilizza il potere di elaborazione parallelo della GPU per farlo davvero velocemente.

La parte difficile è che gli GPU sono ottimizzato per l'elaborazione parallela . Ciò significa che non puoi scrivere codice come "texela.value += texelb.value" - senza lavoro extra da parte tua, ogni frammento del buffer viene elaborato con zero conoscenza di ciò che accade negli altri frammenti. Per fare riferimento ad altri texel è necessario leggere nuovamente la trama in qualche modo - alcune tecniche leggono una trama più volte con offset ( Questo esempio GL Fa questo per implementare sfocature, altre lo fanno ripetutamente elaborando una consistenza, mettendo il risultato in una trama temporanea e quindi rielaborandolo.

A livello di 10.000 piedi: Sì, un shader di calcolo è un buon strumento per questo tipo di problema poiché coinvolge tonnellate di calcolo autonomo. Ma non sarà facile fare il pipistrello. Se non hai già fatto la programmazione di Shader convenzionale prima, potresti voler guardare prima per abituarsi al modo in cui i GPU funzionano. Anche gli strumenti di base di base (se-then-else o loops) hanno implicazioni e usi di prestazioni molto diversi nella programmazione GPU e ci vuole un po 'di tempo per ottenere la testa nelle differenze. A partire da questo scritto (1/10/13) sembra NVIDIA e UDacity offrono un'introduzione per calcolare Corso di shader che potrebbe essere un buon modo per ottenere velocità.

fwiw Hai anche bisogno di un hardware abbastanza moderno per gli shader di calcoli, che possono limitare il tuo pubblico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top