Generare terreno su GPU


9

Nel mio motore creo un terreno infinito con l'utilizzo dell'algoritmo del rumore Perlin calcolato sulla CPU.

La creazione del terreno procede così:

  • Se la videocamera è vicino alla patch non caricata, crearla
  • Calcola l'array di rumore 513x513 con limiti definiti
  • Calcola normali, tangenti, binormali, indici
  • Passa i dati a vbo

Professionisti:

  • Deve essere eseguito il rendering solo quando necessario
  • Collisione facile da effettuare

contro

  • 64 patch 513x513 lente vengono create in 3,1 secondi (un thread). Per ogni piastrella ~ 20 ms di creazione del rumore, ~ 25 ms vertici, normali, tangenti, bitangenti, indici. Quando la telecamera si muove velocemente, l'utente può notare il caricamento delle tessere.
  • consumando memoria ???

Ora mi chiedevo come accelerare questo generando terreno completamente su GPU Ma ci sono alcuni dubbi:

  • Se gli shader eseguono tutti i frame, non è questo spreco di potenza di calcolo per calcolare il rumore più e più volte? Questo può essere evitato scrivendo il risultato nella trama RBGA e usato successivamente nello shader di vertici per lo spostamento, ma aumentando l'utilizzo della memoria. D'altra parte se la creazione sarebbe super veloce, solo le tessere visibili dovrebbero rimanere nella memoria. Tuttavia, il distacco del buffer provoca la sincronizzazione di gpu-cpu che può rallentare l'app (ho ragione?)
  • Se il terreno è solo una griglia piatta spostata dallo shader di vertici, lo stesso lavoro deve essere fatto sulla CPU per calcolare l'altezza e la normalità in un determinato punto per la collisione.
  • Questo è solo un concetto, ma per accelerare tutto stavo pensando di proiettare la griglia sul viewport, quindi viene utilizzata solo una minima quantità di vertici. Pensi che funzionerebbe?

La mia ultima domanda è:

Qual è la tecnica migliore / più veloce / ampiamente utilizzata per creare infiniti terreni su GPU?


8
Basta notare che la creazione di terreno sulla GPU renderà difficile eseguire il rilevamento delle collisioni, il rilevamento del rilevamento o praticamente qualsiasi tipo di interazione con il terreno.
MichaelHouse

1
Uno shader di calcolo (DX10 o 11) può essere utilizzato per generare il terreno sulla GPU. Ma come affermato da Byte56, dovrai interagire con i valori dalla GPU. msdn.microsoft.com/en-us/library/windows/desktop/…
UnderscoreZero

creare terreno su una GPU mi sembra una cattiva idea. Potrebbe funzionare, ma immagino che probabilmente funzionerebbe un po 'meglio se si generasse semplicemente il terreno sul lato CPU e si inviasse il disegno standard alla GPU.
Benjamin Danger Johnson,

Solo la mia esperienza; In realtà ho fatto proprio questo con aparapi e in realtà ho fatto funzionare la dannata cosa; ma alla fine è stato più lento del semplice far funzionare la CPU. Penso a causa del sovraccarico di inviare dati da / verso la GPU. Se ricordo bene la GPU funziona davvero solo se il calcolo è grande rispetto alla dimensione dei dati (e anche grande in termini assoluti)
Richard Tingle

Questo articolo potrebbe darti alcune idee http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Jeremiah Leslie

Risposte:


2

Bene, se dovessi provare a usare la GPU per una cosa del genere, penso che andrei per compute / opencl / cuda.

Tuttavia, indipendentemente dall'utilizzo della GPU o della CPU (che è quello che effettivamente faccio), lo farei in modo asincrono, decidere che hai bisogno di un nuovo terreno per il frame corrente è probabilmente troppo tardi (ad esempio, considera 1000ms / 60 = 16.666ms, e l'intero frame vuole adattarsi a quello).

Inizia a generare (o caricare da file compressi) il terreno su un thread di lavoro e rendilo disponibile al resto del gioco e al rendering una volta terminato tale lavoratore, in genere questo sarà il fotogramma successivo, o forse il fotogramma successivo, quindi il l'utente non noterà davvero la differenza, ma rende le cose più fluide.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.