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?