Finite Element Shader

1

Sto lavorando su un involucro geometrico per un risolutore di impingement di scarico a getto di spazio. Una parte fondamentale della soluzione è determinare cosa il jet può "vedere" e quindi colpire. Il mio modello è raggruppato con nodi o griglie disposte su elementi a 3 o 4 lati che sono ulteriormente raggruppati in corpi. L'ombreggiatura per i corpi viene gestita attraverso le normali verso l'esterno e viene eseguita molto velocemente, cioè il rilevamento sul retro. L'ombreggiatura da corpo a corpo viene attualmente eseguita proiettando tutti i punti visibili sul piano di un elemento e ombreggia i punti contenuti all'interno del contorno di quell'elemento, purché il valore z sia maggiore della distanza dall'elemento. Questa operazione è lenta.

Il mio attuale benchmark sta elaborando solo circa 3000 elementi al secondo. So che ci devono essere terribili inefficienze nel mio codice, ma credo che questo sia dovuto a un approccio inadeguato. Fondamentalmente controllo ogni punto fino a quando non è ombreggiato o sono a corto di elementi, quindi è visibile. Loop all'interno di loop e un altro controllo di loop per auto-ombreggiamento.

Ho esaminato lo scafo convesso 3D e la visibilità diretta dei set di punti. Inoltre ho esaminato la rimozione di punti nascosti. Come previsto, la maggior parte della discussione riguarda le applicazioni di rendering 3D. Non ho questo. Tutte le informazioni vengono elaborate dalla CPU e mai rese.

Ho bisogno di suggerimenti su come costruire / avvicinare efficacemente un simile shader. Cosa funziona bene, cosa evitare. Non ho accesso all'hardware grafico sulle macchine che eseguiranno la soluzione finale. Se è importante, sto lavorando attualmente in C / C ++ su sistemi Linux.

    
posta Matt 29.09.2015 - 18:42
fonte

2 risposte

0

Dopo aver ricercato vari modi per eseguire il culling e la rimozione di punti nascosti, risulta che i miei approcci erano buoni. Il problema era dividere lo spazio in modo tale da non guardare costantemente in ogni punto per ogni superficie. La tecnica che ho scelto di utilizzare è chiamata Octree . Il Octree funziona per il mio caso perché ho un grande modello centrale che è immutabile e pochi elementi piccoli che possono spostarsi. Il modello grande è diviso in anticipo in elementi di volume. Se ci sono abbastanza punti ed elementi all'interno di un dato volume, esso è suddiviso in 8 volumi lungo i piani centrali. Usare l'albero è solo una questione di tracciare il raggio dalla sorgente al punto e controllare ogni volume intersecato per gli elementi che bloccano il raggio. Questo elimina la stragrande maggioranza dei calcoli. Gli elementi del volume che non sono intersecati vengono ignorati. Introduzione a Octrees , Wikipedia

    
risposta data 27.09.2016 - 21:41
fonte
1

Sono sicuro che otterrai altre buone risposte, ma nella mia esperienza (con ray-tracing) aiuta sempre a vedere esattamente cosa ci vuole tempo e questo è la tecnica che io e gli altri utilizziamo.

Al di là delle ovvie correzioni come l'eliminazione della gestione della memoria inutile, quello che ho trovato è che la sequenza di decisioni e calcoli da un raggio all'altro ha una strong somiglianza. Quella somiglianza può essere sfruttata per velocizzare enormemente le cose. È probabile che qualcosa di simile possa essere fatto nel tuo caso.

    
risposta data 05.10.2015 - 19:32
fonte

Leggi altre domande sui tag