Szczegółowy rzut horyzontu wodnego siatki

13

Próbuję zaimplementować scenę oceaniczną za pomocą C ++ i DirectX11. Obecnie mam rzutowaną siatkę, fale Gerstnera i podstawowe cieniowanie. Mój problem polega na tym, że kiedy celuję kamerą w poziomie, aby widzieć horyzont wodny, w oddali rzutowana siatka staje się niewystarczająca, nawet przy wysokich liczbach wierzchołków. Te zrzuty ekranu ilustrują problem:

zacieniona powierzchnia wody

szkieletowa powierzchnia wody

Wiem, że przyczyną problemu jest koncepcja rzutowanej siatki (siatka jest wyszczególniona w pobliżu kamery, z grubsza daleko od niej), ale musi być najlepsza praktyka, aby to rozwiązać.

Jakieś pomysły?

Gábor Szalóki
źródło

Odpowiedzi:

7

Uważam, że powszechnym rozwiązaniem jest podzielenie transformacji kamery używanej do rzutowania siatki z transformacji kamery używanej do renderowania siatki. W perspektywach zbliżonych do góry dwie kamery pokrywają się, ale gdy kamera zbliża się do perspektywy poziomej, kamera projekcyjna odchyla się i stara się zachować minimalne nachylenie, tzn. Unosi się gdzieś nad kamerą i lekko patrzy w dół.

Problem polega na tym, aby pole widzenia kamery projekcyjnej zawsze pokrywało obszar sceny widziany z kamery renderującej. Nie mam pod ręką zasobu, który wyjaśniałby, jak obliczyć odpowiednie transformacje, i może być żmudne wyprowadzanie go ręcznie.

Innym rozwiązaniem jest pobranie zestawu narzędzi do przetwarzania sygnału: artefakty widoczne na obrazie są zasadniczo aliasingowe, spowodowane niewystarczającym próbkowaniem pola wysokości fali przez rzutowaną siatkę. Dlatego jednym z rozwiązań jest odpowiednie filtrowanie pola wysokości, w zależności od rzutowanego obszaru komórki siatki. Sądzę, że jest to wykorzystywane do renderowania oceanów offline i zasadniczo zapewnia, że ​​fale na horyzoncie będą płaskie. Nie jestem jednak pewien, czy jest to wykonalne w renderowaniu w czasie rzeczywistym, ponieważ potrzebujesz wysokiej jakości filtrowania anizotropowego, aby takie podejście wyglądało rozsądnie.

Benedikt Bitterli
źródło
Dzięki za radę, na razie wybrałem leniwe rozwiązanie. Używam funkcji w module cieniującym wierzchołek, która określa tłumienie fali z odległości od kamery.
Gábor Szalóki
6

Możesz być realistyczny i realistyczny. Sekret polega na zmianie reprezentacji za każdym razem, gdy informacje docierają do skali Shannona-Nyquista (tj. siatki): od geometrii do normalnych map po modele cieniowania. Ten artykuł jest dla Ciebie: http://maverick.inria.fr/Publications/2010/BNH10/index.php (zobacz także filmy z Yoube)

Fabrice NEYRET
źródło
3

Niektóre programy, takie jak Maya, rozwiązują ten problem, używając biegunowego (lub faktycznie kartezjańskiego, który zmienia biegunowo na odległość) w podobny sposób, jak siatka wyśrodkowana na pozycji kamery. Ta konfiguracja dodaje więcej szczegółów tam, gdzie liczy się najbardziej. Następnie polegają one na normalnym przetwarzaniu shaderów w dalszych zakresach. Jest miejsce na wyjazd na improwizację. Zmodyfikujesz to podejście nieco na zimno i uzyskasz dowolny inny kształt, który zwiększy gęstość siatki w kierunku kamery. Zaletą tego jest to, że możesz rozciągnąć efekt aż do horyzontu, nie martwiąc się o szew.

W tym przypadku sztuczką, aby nie doprowadzić do pomieszania się przemieszczenia, jest stopniowe zmniejszanie przemieszczenia w miarę oddalania się. Następnie postępujesz zgodnie z normalną modyfikacją modułu cieniującego piksele. Jest to łatwiejsze do filtrowania niż filtrowanie dokładnej krawędzi shiluette. Także jeśli widzisz to z daleka, twoje wawrzy są prawdopodobnie wystarczająco płaskie.

joojaa
źródło