Ponieważ producenci sterowników GPU zwykle nie zadają sobie trudu, aby wdrożyć je noiseX
w GLSL, szukam zestawu funkcji narzędziowych „szwajcarski scyzoryk do randomizacji grafiki” , najlepiej zoptymalizowanego do użycia w modułach cieniujących GPU. Wolę GLSL, ale kod zrobi dla mnie jakikolwiek język, nie mam nic przeciwko tłumaczeniu go na GLSL.
W szczególności oczekiwałbym:
a) Funkcje pseudolosowe - N-wymiarowy, równomierny rozkład na [-1,1] lub powyżej [0,1], obliczony na podstawie nasion M-wymiarowych (najlepiej dowolna wartość, ale nie mam nic przeciwko ograniczeniu nasion na przykład 0..1 dla jednolitego rozkładu wyników). Coś jak:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
b) Ciągły hałas, taki jak szum Perlina - znowu, wymiar N, + - równomierny rozkład, z ograniczonym zestawem wartości i, dobrze wyglądający (niektóre opcje konfiguracji wyglądu, takie jak poziomy Perlina, mogą być również przydatne). Spodziewałbym się takich podpisów:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Nie przepadam za teorią generowania liczb losowych, więc najchętniej wybrałbym gotowe rozwiązanie , ale doceniłbym również odpowiedzi typu „oto bardzo dobry, wydajny 1D rand (), i pozwól mi wyjaśnić jak zrobić dobry N-wymiarowy rand () na wierzchu ... " .
vec2 co
? czy to jest zasięg? nasionko?co.xy
jest używany zamiastco
?Przyszło mi do głowy, że można użyć prostej funkcji skrótu do liczb całkowitych i wstawić wynik do mantysy pływaka. IIRC specyfikacja GLSL gwarantuje 32-bitowe liczby całkowite bez znaku i reprezentację zmiennoprzecinkową IEEE binary32, więc powinna być idealnie przenośna.
Właśnie tego spróbowałem. Wyniki są bardzo dobre: z każdym próbowanym wejściem wygląda dokładnie jak statyczny, bez widocznych wzorów. W przeciwieństwie do popularnego fragmentu sin / fract ma dość wyraźne ukośne linie na moim GPU przy tych samych danych wejściowych.
Wadą jest to, że wymaga GLSL v3.30. I choć wydaje się dość szybki, nie oceniłem empirycznie jego wydajności. AMD Shader Analyzer twierdzi, że 13,33 pikseli na zegar dla wersji vec2 na HD5870. Kontrast z 16 pikselami na zegar dla fragmentu sin / fract. Jest to z pewnością trochę wolniejsze.
Oto moja implementacja. Zostawiłem to w różnych kombinacjach tego pomysłu, aby ułatwić czerpanie własnych funkcji.
Zrzut ekranu:
Sprawdziłem zrzut ekranu w programie do edycji obrazów. Istnieje 256 kolorów, a średnia wartość to 127, co oznacza, że rozkład jest jednolity i obejmuje oczekiwany zakres.
źródło
Nie, nie robi tego, nie od 2005 roku. Po prostu ludzie nalegają na pobranie starej wersji. Wersja podana w podanym linku używa tylko 8-bitowych tekstur 2D.
Nowa wersja autorstwa Iana McEwana z Ashimy i mnie nie używa tekstury, ale działa z około połową prędkości na typowych platformach stacjonarnych z dużą przepustowością tekstur. Na platformach mobilnych wersja bez tekstur może być szybsza, ponieważ teksturowanie jest często istotnym wąskim gardłem.
Nasze aktywnie utrzymywane repozytorium źródeł to:
https://github.com/ashima/webgl-noise
Tutaj znajduje się zbiór wersji hałasu bez tekstur i tekstur wykorzystujących teksturę (przy użyciu tylko tekstur 2D):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Jeśli masz jakieś konkretne pytania, wyślij mi e-mail bezpośrednio (mój adres e-mail można znaleźć w
classicnoise*.glsl
źródłach).źródło
glBindTexture(GL_TEXTURE_1D, *texID);
itp. Nie jest jasne, co rozumiesz przez „ podany przez ciebie link”, ponieważ cytujesz z mojej odpowiedzi ale ta odpowiedź nie zawierała linku do Twojej implementacji. Zaktualizuję moją odpowiedź, aby wyjaśnić, o czym mówię, i odzwierciedlić nowe informacje, które podałeś. Charakteryzowanie ludzi jako „nalegających” na pobranie starej wersji jest zniekształceniem, którego nie przypisujesz.Złoty hałas
Zobacz teraz Złoty szum w swojej przeglądarce!
Ta funkcja poprawiła rozkład losowy w stosunku do bieżącej funkcji w odpowiedzi @appas z dnia 9 września 2017 r .:
Funkcja @appas jest również niekompletna, ponieważ nie ma dostarczanego materiału siewnego (UV nie jest materiałem siewnym - taki sam dla każdej ramki) i nie działa z chipsetami o niskiej precyzji. Złoty szum działa domyślnie z małą precyzją (znacznie szybciej).
źródło
Istnieje również fajna implementacja opisana tutaj przez McEwana i @StefanGustavson, która wygląda jak szum Perlina, ale „nie wymaga żadnej konfiguracji, tj. Nie ma tekstur ani jednolitych tablic. Wystarczy dodać ją do kodu źródłowego modułu cieniującego i wywołać tam, gdzie chcesz”.
Jest to bardzo przydatne, zwłaszcza biorąc pod uwagę fakt, że wcześniejsza implementacja Gustavsona, z którą łączył się @dep, wykorzystuje teksturę 1D, która nie jest obsługiwana w GLSL ES (język cieniowania WebGL).
źródło
Zrób to:
Nie używaj tego:
Wyjaśnienie znajdziesz w Ulepszeniach kanonicznego jednoliniowego GLSL rand () dla OpenGL ES 2.0
źródło
mod
przybliżeniu pi?Właśnie znalazłem tę wersję szumu 3d dla GPU, podobno jest to najszybszy dostępny:
źródło
Prosta, postrzępiona wersja 1d Perlin, zasadniczo losowy zygzak lfo.
Znalazłem również hałas perlin 1-2-3-4d na stronie internetowej właściciela shadertoy inigo quilez perlin, a także voronoi i tak dalej, ma dla niego w pełni szybkie implementacje i kody.
źródło
hash: Obecnie istnieje webGL2.0, więc liczby całkowite są dostępne w (w) GLSL. -> w przypadku wysokiej jakości przenośnego skrótu (przy podobnym koszcie niż brzydkie skróty zmiennoprzecinkowe) możemy teraz zastosować „poważne” techniki mieszania. IQ zaimplementował niektóre w https://www.shadertoy.com/view/XlXcW4 (i więcej)
Na przykład:
źródło
Poniżej znajduje się przykład dodawania białego szumu do renderowanej tekstury. Rozwiązaniem jest użycie dwóch tekstur: oryginalnego i czystego białego szumu, takiego jak ten: biały szum wiki
Udostępniany fragment zawiera parametr uNoiseFactor, który jest aktualizowany przy każdym renderowaniu przez aplikację główną:
źródło
Przetłumaczyłem jedną z implementacji Java Kena Perlina na GLSL i wykorzystałem ją w kilku projektach ShaderToy.
Poniżej znajduje się interpretacja GLSL, którą zrobiłem:
Przetłumaczyłem to z Załącznika B z Rozdziału 2 Sprzętu Hałasu Kena Perlina w tym źródle:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Oto publiczny odcień, który zrobiłem w Shader Toy, który korzysta z funkcji wysyłania hałasu:
https://www.shadertoy.com/view/3slXzM
Inne dobre źródła, które znalazłem na temat hałasu podczas moich badań, to:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Bardzo polecam książkę o shaderach, ponieważ zapewnia ona nie tylko świetne interaktywne wyjaśnienie hałasu, ale także inne koncepcje shaderów.
EDYTOWAĆ:
Może być w stanie zoptymalizować przetłumaczony kod, używając niektórych przyspieszanych sprzętowo funkcji dostępnych w GLSL. Zaktualizuję ten post, jeśli skończę.
źródło