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 .
źródło
Odpowiedzi:
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ć:
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):
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.
źródło