Disegnare pianeti molto grandi a rotazione lenta


8

Vorrei disegnare una grafica molto grande (~ 500 px) di pianeti che ruotano lentamente. Questa grafica è pensata per stupire. Qual è il modo migliore per farlo? Non ho esperienza con nessun particolare motore 3D e non sono nemmeno sicuro su quale piattaforma questo gioco funzionerebbe, quindi:

  • Potrei pre-renderizzare ogni fotogramma, ma a 500 px e un periodo di rotazione di 10 secondi, è una quantità ridicola di dati per pianeta.
  • Potrei usare un motore 3D e mappare la trama del pianeta su una mesh che si avvicina a una sfera, ma a 500 px, temo che il conteggio dei poligoni dovrebbe essere enorme per renderlo bello.
  • Potrei scrivere una sorta di motore 3D personalizzato che non fa altro che rendere efficacemente una sfera strutturata, convertendo la coordinata x / y di ciascun pixel della vista nello spazio delle coordinate della trama della sfera - ma questo è coinvolto e non potrebbe beneficiare di accelerazione grafica.
  • Qualcos'altro a cui non ho pensato?

Ecco un esempio di GIF animata di ciò che intendo. (A 100x100 px e 60 fotogrammi, è già abbastanza grande, mi dispiace.) Immagina questo, molto più grande, ruotando molto più lentamente e animando più uniformemente:

testo alternativo

Ma se questo fosse 500x500 px e 10 x 25 = 250 fotogrammi, parleremmo di centinaia di MB di dati, quindi questo approccio diretto non funziona.


È impossibile rispondere se non hai idea di quale sia la tua piattaforma di destinazione.
Attaccando

1
Bene, se ha una dimensione di 500 px, non è un iPhone pre-4G / Android equivalente, che è l'unica cosa che mi aspetto di avere problemi con un rendering così semplice.

8
Hmm, penso che la risposta potrebbe essere semplicemente "Zarkonnen, non hai idea di quanto siano potenti le GPU in questi giorni". : P
Zarkonnen,

1
Non sembra un'enorme quantità di dati.
Il comunista Duck il

Risposte:



4

Dato che stai guardando la sfera con una telecamera costante, puoi eseguire rendering di alta qualità estremamente velocemente con una semplice tabella di ricerca precalcolata.

Come passo precalcolato, con qualsiasi metodo che ti piace (di solito con poligoni o raytracing) esegui il rendering di una sfera mappata trama in un buffer offsceen, ma invece di calcolare i colori in base alla trama, memorizzi solo le coordinate u / v della trama.

Quindi, quando si esegue il rendering del pianeta reale, si esegue il rendering di un quadrato semplice e per ogni pixel si ottengono le coordinate u / v effettive dalla tabella di ricerca e i colori dei pixel dalla trama del pianeta utilizzando tali coordinate u / v. Per ruotare la sfera è sufficiente sfalsare la coordinata u con l'angolo di rotazione.

Questa tecnica era molto popolare nel demoscene, ad esempio con effetti tunnel mappati a trama, ma sfortunatamente non sono riuscito a trovare buoni tutorial a riguardo.


0

Se lo stai facendo in un'impostazione 2D, vedi questa domanda precedente ...

Illusione 3D di una trama del pianeta 2D

Lo stesso concetto avrebbe funzionato bene con un'immagine di grandi dimensioni e spostando dinamicamente la trama del terreno su uno strato sotto il "buco" nello spazio.

Leggi il link sopra per sapere cosa intendo con questo.


3
Non mi piace proprio questo metodo, perché sembra esattamente come è. Una trama piatta viene spostata senza distorsioni durante la rotazione.
Attacco di

0

Se comprimessi l'animazione risultante con un moderno codec video, non sarebbe particolarmente grande e in nessun luogo vicino a "diverse centinaia di MB di dati" né ridicola ...

Ma come già detto, tutto dipende da quale sia la tua piattaforma target e come hanno detto tutti gli altri; il semplice rendering di una sfera 3D liscia comporterebbe in realtà una quantità insignificante di poligoni e pochissima memorizzazione dei dati (essendo la trama tutto ciò che c'è e anche a risoluzioni molto elevate, la compressione jpeg standard la ridurrebbe a nulla).

Tutto dipende anche un po 'da quanto sei esigente - se stai cercando l'aspetto a scorrimento di un quarto di pixel e i dettagli della trama alla pari con le demo all'avanguardia e non solo i giochi contemporanei con tutta la loro interpolazione e aliasing problemi anche a 8x FSAA - quindi potrebbe essere coinvolto quasi all'infinito per raggiungere (e richiedere anche un po 'di inganno artistico) ^^


1
-1 - La "compressione jpeg standard" non esiste per le trame e il tuo terzo paragrafo non ha davvero senso. Lo "scrolling dei quarti di pixel" è ottenibile tramite un filtro standard in OpenGL / Direct3D e AA sarebbe banale per una scena del genere.

Vero. A mia difesa, quando la domanda affermava "ridicola quantità di dati per pianeta" per una soluzione di animazione - ho pensato alla memorizzazione dei dati, non alla velocità di trasmissione dei dati. L'ultimo paragrafo era principalmente un'osservazione che chiedeva quanto fosse alta la barra. Non ho mai visto AA come banale, anche le soluzioni di rendering offline più rigorose per film che fanno centinaia di passaggi in modi esotici hanno un aliasing non appena le cose iniziano a muoversi, specialmente su schermi di PC a bassa densità - ma la maggior parte delle persone non lo è schizzinosi.
Oskar Duveborn,

0

Se hai problemi con le prestazioni nel farlo in modo tradizionale (trama e mappatura normale su una sfera poligonale alta), che come molti hanno menzionato non dovrebbero essere un problema a quella risoluzione:

"Raytrace" con uno shader di frammenti. Se la videocamera è fissa, tutto ciò di cui hai bisogno è un input float uniforme al tuo shader di frammento (per l'angolo di rotazione) e lo shader può occuparsi del calcolo delle coordinate della trama. I vettori di illuminazione potrebbero anche essere gli stessi per ogni fotogramma. Per quanto riguarda l'antialiasing puoi anche ottenere una silhouette sferica perfetta con poca ingegnosità (se il pixel si trova sul limite della sfera, calcola la sua copertura)

Questo ti ha inviato solo 4 vertici attraverso la pipeline e non richiede di allocare un gigantesco framebuffer multisampled per combattere jaggies.

A costo di dover elaborare diversi algoritmi su ordinazione.

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.