Idoneità della nebbia terrestre con l'uso di quad alfa a strati?


16

Un approccio stratificato userebbe una serie di enormi quadricromia strutturati alfa disposti parallelamente al terreno, intersecando tutta la geometria del terreno interveniente, per fornire l'illusione della nebbia terrestre in modo abbastanza efficace dall'alto, guardando in basso e in qualche modo meno efficace quando all'interno della nebbia e guardando verso l'orizzonte (vedi immagine sotto).

In alternativa, un approccio basato principalmente sullo shader calcolerebbe invece la densità in funzione della distanza di visione nel substrato della nebbia del terreno e produrrebbe il valore del frammento in base a quello.

Senza dover testare personalmente ogni approccio , vorrei prima ascoltare le esperienze degli altri (non le speculazioni!) Su quale tipo di prestazioni avrà probabilmente l'approccio a strati alfa. Lo chiedo specificamente a causa degli impatti spesso citati del sovraccarico (non sono sicuro di quanto sia legato il tasso di riempimento del tuo sistema desktop medio). Un elenco di giochi che utilizzano questo approccio, in particolare i giochi più vecchi, sarebbe immensamente utile: se questo fosse praticabile su hardware pre DX9 / OpenGL2, probabilmente funzionerà bene per me.

Una grande domanda riguarda questo tipo di effetto:

inserisci qui la descrizione dell'immagine

(Il credito per le immagini va a Lume di lume.com)

Notare come la gradazione di nebbia verticale è continua / regolare. OTOH, usando i livelli quadrupli testurizzati, posso solo supporre che i livelli sarebbero potentemente ovvi quando li percorriamo: più sono sparsi, più è ovvio. Ciò è in contrasto con il punto in cui i piani di nebbia sono allineati per affrontare il giocatore in ogni fotogramma, dove questa grossolanità sarebbe molto meno ovvia.


1
Perché si vuole utilizzare alfa strati quad per questo? L'approccio "shader-heavy" non è solo più accurato, ma non è nemmeno esattamente noto per essere lento .
Nicol Bolas,

1
@StephanvandenHeuvel Certo, ma si tratta di nebbia allineata nello spazio, basata sulla distanza. Nebbia non allineata al suolo. Corretta?
Ingegnere

1
@NickWiggill Sì, hai ragione.
Stephan van den Heuvel,

1
IIRC, la Wii aveva una nebbia allineata a terra nella sua (semi) tubatura fissa. Apparentemente l' glFogCoordestensione del precedente OpenGL ha permesso di farlo . Anche se sembra limitato: è a terra o a distanza.
Laurent Couvidou,

1
Quake 3 ha fatto qualcosa di simile a questo, usando un approccio a pipeline fissa che ha funzionato con GL1.1. La grande preoccupazione che avrei è che fillrate / overdraw potrebbero accumularsi male, ma probabilmente vale la pena scaricare il codice sorgente Q3 e rivederne l'implementazione; potresti non fare esattamente lo stesso, ma almeno potrebbe aiutarti a prendere una decisione.
Massimo

Risposte:


15

Dato che hai chiesto esperienze, ecco le mie.

Ai tempi in cui stavo programmando i giochi per PS2, l'approccio dei "livelli alfa a quadretti" era un modo in cui spesso implementavamo la nebbia. Occasionalmente come nebbia a terra, ma molto più comunemente come nebbia a schermo intero. E ha funzionato bene in entrambi i casi. Quindi sì, era praticabile nei giorni dello shader pre-frammento.

Beh, in un certo senso. Il problema, come hai notato, è che se vuoi una nebbia liscia come quella vista nello screenshot, hai bisogno di un numero piuttosto assurdo di quad alfa.

Su PS2, di solito potremmo permetterci un posto tra tre e cinque livelli. Che sicuramente sembravano "muri" di nebbia che galleggiavano di fronte a te. Oltre a ciò, il tasso di riempimento ha iniziato a eliminare il nostro frame rate.

Normalmente, questi quadricipiti verrebbero disegnati a distanze fisse di fronte alla telecamera, quindi non avrai mai la situazione che dici, "camminando" attraverso uno di essi. D'altra parte, usando quelle distanze fisse, tutto il resto lo fapassare attraverso quegli aerei mentre il giocatore si muove, il che è un problema grafico abbastanza ovvio. Quasi tutti lo facevano allora, ma non sarebbe accettabile ora (a meno che non lo facessi per motivi stilistici). (Eccezione: alcune persone hanno calcolato i valori di nebbia come parte dell'equivalente di PS2 di uno shader di vertice. Funzionava ed era molto più veloce, ma richiedeva che i tuoi modelli fossero altamente tassellati. Non potevi avere pareti lunghe, ad esempio, perché solo la nebbia essere calcolata agli angoli del muro, e quindi essere spalmata su tutta la faccia del muro. Il muro appariva completamente appannato se ti trovassi proprio accanto al suo centro, ad esempio, poiché stava solo testando i livelli di nebbia al suo endpoint)

Si noti che se si posizionano i quaderni di nebbia staticamente nel mondo (come si dice come una possibilità), non sarà possibile ottenere l'aspetto di una nebbia estremamente liscia, come nell'immagine che si fornisce - ci saranno strane sovrapposizioni tra quad adiacenti a seconda dell'orientamento dello spettatore. Queste sovrapposizioni possono apparire come strisce o trapezi (se i quadretti non sono testurizzati) o come grumi (se sono strutturati).

Ma supponiamo che stiamo usando ampi quad, rivolti verso lo schermo per fare questa nebbia sul terreno e fare alcuni calcoli su come rendere la nebbia davvero liscia usando questo metodo, su un terreno piano, con una fotocamera che guarda dritto in avanti - questa è la nostra situazione ideale . Supponiamo che la risoluzione HD: 1920x1080, che pone il nostro orizzonte su scanline 540. Supponiamo anche che abbiamo visibilità fino all'orizzonte (ovvero, supponendo che la nebbia non raggiunga l'opacità completa prima di raggiungere l'orizzonte). Con l'avvio di un quaderno di nebbia e uno di arresto su ciascuna linea di scansione (per ottenere una nebbia uniforme), sono necessari (540 * 2 ==) 1080 quad di nebbia. Ognuno di questi 1080 fendinebbia coprirà l'intera estensione orizzontale dello schermo,

Stimiamo in basso e diciamo che in media un piano antinebbia coprirà circa 300 file di pixel. Le più vicine copriranno di meno, le più lontane copriranno di meno, le file centrali copriranno molto di più.

Con questa stima, otteniamo (1920x300 ==) 576.000 pixel che vengono toccati dal quadruplo nebbia medio. In totale, questo è (576.000 * 1080 ==) 622.080.000 pixel che vengono toccati in totale per l'intero effetto "nebbia uniforme tramite il rendering di molta geometria traslucida". E quel numero aumenterà per le persone che corrono con una risoluzione più alta. Inoltre, otteniamo lo stesso numero di test sul buffer z e quasi lo stesso numero di operazioni di fusione dei pixel, poiché tutti questi livelli trasparenti si disegnano ripetutamente l'uno sull'altro. Sono molti pixel.

E questo è lo scenario migliore: otterrai una copertura molto più ampia dello schermo dei fendinebbia se l'utente guarda in basso o si accovaccia.

Nota che, poiché stiamo sovrapponendo 1080 quad, probabilmente vogliamo un valore alfa di circa (1.0 / 1080 ~ =) 0.0009 impostato su ciascuno, in modo che la nostra nebbia raggiunga la piena opacità se guardi attraverso tutti i 1080 quad. (Potremmo andare più in alto di così, ma questo è il valore supponendo che vogliamo allargare il range il più possibile). Si noti che questo valore non può essere rappresentato come componente alfa di un valore di colore a 32 bit (256 * 0,0009 ~ = 0,237 e quindi verrà arrotondato per difetto a 0 se si prova). Dovrai fornire il valore 0.0009 a OpenGL come valore in virgola mobile affinché funzioni. (Nota anche che non vorrai impostare lo stesso valore su ciascuno di essi, mentre abbiamo definito che volevamo che un quad iniziasse e uno finisse su ciascuna scanline sotto l'orizzonte per darci una nebbia uniforme,

Nota anche che le miscele di nebbia non funzioneranno correttamente usando questo approccio, come farebbero con uno shader moderno - invece di ottenere un calcolo di "fusione tra il colore dell'oggetto base e il colore della nebbia usando questa percentuale", ottieni 1080 calcoli di "fusione tra il colore finora e il colore nebbia dalla percentuale di nebbia". Ciò significa che la nebbia influenzerà gli oggetti a seguito di una caduta logaritmica. (Cioè, un oggetto affetto da 20 fendinebbia apparirà meno del doppio appannato rispetto a qualcosa affetto da 10 fendinebbia, poiché i primi fendinebbia hanno un impatto maggiore nell'operazione di fusione).

Tutto ciò per dire: usa solo uno shader di frammenti.

No davvero. È più semplice ed economico, più veloce e più veloce da implementare e meno soggetto a errori e ti consente di tornare a realizzare il tuo gioco ed è meglio in ogni modo possibile. Lo avremmo fatto totalmente nell'era della PS2 se fosse stato vagamente possibile in quel momento.


1
+1 per una risposta completa basata sull'esperienza del mondo reale.
concept3d

3
Un anno e un mese fa, quando ho scritto questa domanda, ero ancora disposto a giocare a pollo con i tassi di riempimento. Ora opterei per una trama 3D grossolana per rappresentare i volumi di nebbia terrestre con densità in costante movimento determinate dal rumore perlinico 3D, e quindi utilizzarlo come base per gli effetti dello spazio dello schermo, proprio come hai suggerito.
Ingegnere
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.