Jak wygenerować szum proceduralny na kuli?


15

Chciałbym generować szum proceduralny na powierzchni kuli (np. W celu proceduralnego generowania planet lub kulek o marmurowej fakturze). Oczywiście mógłbym po prostu wziąć standardowy algorytm szumu i zmapować go na kulę, ale ma to wszystkie problemy z rzutowaniem samolotu na kulę, jak zniekształcenie na biegunach lub gdzie indziej.

Podejrzewam, że mógłbym generować szum objętościowy i „wycinać” kulę, ale wydaje się to niepotrzebnie nieefektywne - a jeśli hałas ma jakieś artefakty oparte na siatce, nadal nie pojawiałyby się jednolicie na kuli. Co więcej, przynajmniej w przypadku szumu Simplex, wycinanie wycinków 2D z szumu 3D ogólnie wygląda inaczej niż generowanie od razu szumu 2D.

Czy jest jakiś sposób na uniknięcie tych problemów, np. Poprzez generowanie szumu natywnie na kuli? Hałas powinien mieć co najmniej jakość szumu Perlina , najlepiej szumu Simplex .


Może projekcja trójplanarna, jak widać w GPU Gems 3 ? Pytanie brzmi, czy hałas będzie wyglądał na rozmazany, czy w inny sposób niepożądany, gdy będzie mieszał się między różnymi projekcjami.
Nathan Reed,

Dodałem inną możliwą metodę do mojego postu. Warto wyjaśnić swoje pytanie bardziej szczegółowymi wymaganiami. tzn. dlaczego wycinek szumu 2D 3D nie spełnia twoich wymagań wizualnych? Jakie są twoje wymagania wydajnościowe?
John Calsbeek,

@JohnCalsbeek Szczerze mówiąc, nie mam pod ręką żadnych trudnych wymagań. To było tylko pytanie, które mnie ciekawiło, które, jak sądzę, dałoby mi szansę na prywatną wersję beta. Oczywiście wycięcie wycinka 2D z szumu 3D będzie wystarczające dla wielu aplikacji, ale jestem pewien, że będzie to miało pewien wpływ na wydajność i anizotropie (które mogą, ale nie muszą być zauważalne). „Wycięcie kuli z szumu 3D jest najlepszą opcją, ponieważ ...” jest zdecydowanie prawidłową odpowiedzią.
Martin Ender,

Możesz sprawdzić ten shadertoy, który hałasuje na kuli: shadertoy.com/view/4sfGzS
Alan Wolfe

Odpowiedzi:


15

Zastanowiłbym się nad pójściem z szumem 3D i ocenieniem go na powierzchni kuli.

W przypadku szumu gradientowego, który naturalnie znajduje się w dziedzinie powierzchni kuli, potrzebujesz regularnego wzoru punktów próbnych na powierzchni, które mają naturalne informacje o łączności, z mniej więcej równym obszarem w każdej komórce, aby można było interpolować lub sumować sąsiednie wartości. Zastanawiam się, czy coś takiego jak siatka Fibonacciego może działać:

Siatka Fibonacciego na powierzchni kuli

Nie przeżułem matematyki, aby ustalić, ile pracy wymagałoby ustalenie wskaźników i odległości do twoich czterech sąsiadów (nawet nie wiem, czy we wszystkich przypadkach skończysz z czterema dobrze określonymi sąsiadami), i podejrzewam, że może to być mniej wydajne niż zwykłe używanie szumu 3D.

Edycja: Ktoś przeżuł matematykę! Zobacz ten nowy artykuł na temat mapowania sferycznego Fibonacciego . Wydaje się, że przystosowanie go do szumu kuli byłoby proste.


Jeśli renderujesz sferę, a nie tylko oceniasz hałas na powierzchni kuli, i dobrze Ci jest z teselacją kuli do rozdzielczości siatki szumów, możesz utworzyć siatkę geodezyjną na powierzchni kuli (podzielony dwudziestościan, zazwyczaj):

Kula geodezyjna

Każdy wierzchołek kuli może mieć losowo generowany gradient szumu gradientowego. Aby przekazać te informacje do modułu cieniującego piksele (chyba że chcesz prostej interpolacji, takiej jak szum wartości), możesz potrzebować techniki, takiej jak renderowanie szkieletu tego artykułu za pomocą współrzędnych barycentrycznych : wykonaj renderowanie w stanie nieindeksowanym, przy czym każdy wierzchołek zawiera współrzędne baricentryczne tego wierzchołka w trójkącie . Następnie możesz czytać z SV_PrimitiveID(lub odpowiednika OpenGL) w module cieniującym pikseli, odczytywać trzy gradienty szumów z wierzchołków na podstawie tego, na jakim trójkącie się znajdujesz, i stosować dowolne obliczenia szumów, używając interpolowanych współrzędnych barycentrycznych.

Myślę, że najtrudniejszą częścią tej metody jest opracowanie schematu mapowania identyfikatora twojego trójkąta na trzy próbki, aby sprawdzić wartości szumu na każdym wierzchołku.

Jeśli potrzebujesz wielu oktaw szumu lub szumu w rozdzielczości lepszej niż model kuli, możesz być w stanie wykonać grubą siatkę geodezyjną z wierzchołkami i wykonać kilka poziomów podziału w module cieniującym piksele. czyli od barycentryczne współrzędnych, dowiedzieć się, które podzielone trójkąta ty by być w razie siatka została dodatkowo tessellated, a następnie dowiedzieć się, co prymitywne ID i barycentryczne współrzędne byłoby w tym trójkącie.


2
Nigdy wcześniej nie słyszałem o siatkach Fibonacciego; to fajnie!
Nathan Reed,

To fascynujący artykuł. Wygląda na to, że można dostosować parametry, aby zbliżyć się do kwadratu lub siatki heksagonalnej, co pozwoliłoby na różne podejścia do generowania hałasu.
trichoplax,

Miałem pewne niezłe wyniki interpolując w pobliżu krawędzi płytki (owinięte krawędzią), ale to zależy od tego, jaki efekt chcesz osiągnąć i od dokładnych parametrów hałasu. Działa świetnie w przypadku nieco rozmytego hałasu, nie tak dobrze w przypadku kolczastych / drobnoziarnistych.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.