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.