Particolare dell'orizzonte dell'acqua della griglia proiettata


13

Sto cercando di implementare una scena oceanica con C ++ e DirectX11. Attualmente ho una griglia proiettata, onde di Gerstner e un'ombreggiatura di base. Il mio problema è che quando miro la mia fotocamera in orizzontale, in modo da poter vedere l'orizzonte dell'acqua, in lontananza, la griglia proiettata diventa insufficiente, anche con numeri di vertice elevati. Queste schermate illustrano il problema:

superficie d'acqua ombreggiata

superficie dell'acqua wireframe

So che la causa del problema sta nel concetto di griglia proiettata (la griglia è dettagliata vicino alla telecamera, approssimativamente lontana da essa), ma ci deve essere una buona pratica per risolverlo.

Qualche idea?

Risposte:


7

Credo che una soluzione comune sia quella di dividere la trasformazione della telecamera utilizzata per proiettare la griglia dalla trasformazione della telecamera utilizzata per il rendering della griglia. Nelle prospettive vicine al top-down, le due telecamere coincidono, ma quando la telecamera di visualizzazione si avvicina a una prospettiva orizzontale, la telecamera di proiezione si discosta e cerca di mantenere un'inclinazione minima, cioè si sposta da qualche parte sopra la telecamera di visione e guarda leggermente verso il basso.

La cosa difficile è assicurarsi che il campo visivo della telecamera di proiezione copra sempre la regione della scena vista dalla telecamera di rendering. Non ho una risorsa a portata di mano che descriva in dettaglio come calcolare le trasformazioni appropriate e potrebbe essere noioso derivarne manualmente.

Una soluzione diversa è quella di afferrare la casella degli strumenti di elaborazione del segnale: gli artefatti visti nell'immagine sono essenzialmente alias, causati da un campionamento insufficiente del campo di altezza dell'onda da parte della griglia proiettata. Pertanto, una soluzione è quella di filtrare il campo di altezza in modo appropriato, a seconda dell'area proiettata di una cella della griglia. Credo che questo sia usato nel rendering offline degli oceani e in sostanza si assicura che le onde all'orizzonte si appiattiscano. Tuttavia, non sono sicuro di quanto sia fattibile nel rendering in tempo reale, poiché sarebbe necessario un filtro anisotropico di alta qualità per rendere ragionevole questo approccio.


Grazie per il consiglio, ho scelto la soluzione pigra per ora. Uso una funzione nel vertex shader che determina l'attenuazione dell'onda dalla distanza dalla telecamera.
Gábor Szalóki,


3

Alcuni software come Maya, risolvono questo problema usando un polare (o in realtà cartesiano che diventa polare a distanza) in modo molto simile alla griglia centrata sulla posizione della videocamera. Questa configurazione aggiunge ulteriori dettagli dove conta di più Quindi si affidano alla normale elaborazione degli shader a ulteriori intervalli. C'è spazio per il rapporto sessuale improvemenet. Modifichi un po 'a freddo questo approccio e hai qualsiasi altra forma che aumenti la densità della mesh verso la telecamera. Il vantaggio è che puoi allungare l'effetto fino all'orizzonte senza preoccuparti della cucitura.

Il trucco per non confondere il dislocante in questo caso è che riduci gradualmente lo spostamento man mano che ti allontani. Quindi basta usare la normale modifica nel pixel shader man mano che si procede. È più facile filtrare che dover filtrare un bordo shiluette accurato. Inoltre, se riesci a vedere così lontano, le tue vawe sono probabilmente sufficientemente piatte comunque.


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.