Jak wygenerować liczbę losową w HLSL?
Pytam, ponieważ chcę spróbować śledzenia gpu ray . Musisz wygenerować losowe kierunki w module cieniującym piksele. Więc chcę randFloat()
, gdzie wynikiem jest liczba losowa od -1 do +1.
Jaka jest umowa z instrukcją dotyczącą szumu hlsl ? Dokumenty mówią, że został on usunięty z HLSL 2.0 i nowszych wersji. Dlaczego ?
Czytałem o podejściu, w którym wypełniasz teksturę losowymi wartościami, a następnie masz współrzędną tekstury w każdym wierzchołku, który ma indeks do tej tekstury. Ale to na wierzchołek , potrzebuję instrukcji, którą mogę wywołać w module cieniującym piksele. Co więcej, to podejście wymaga „ponownego wysiewu” teksturordów na wierzchołek, jeśli chcesz mieć różne wartości w każdej ramce, a to wymaga aktualizacji bufora wierzchołków dla każdej ramki (co może być kosztowne!)
Jak szczegółowo możesz tanio wygenerować losową liczbę na GPU?
Odpowiedzi:
Pseudolosowe liczby w module cieniującym pikseli nie są łatwe do uzyskania. Generator liczb pseudolosowych w CPU będzie miał stan, z którego zarówno odczytuje, jak i zapisuje przy każdym wywołaniu funkcji. Nie możesz tego zrobić w module cieniującym piksele.
Oto kilka opcji:
Użyj shadera obliczeniowego zamiast shadera pikselowego - obsługują one dostęp do odczytu i zapisu do bufora, dzięki czemu możesz wdrożyć dowolny standardowy PRNG.
Próbka z jednej lub więcej tekstur zawierających losowe dane, na podstawie parametru takiego jak pozycja miejsca na ekranie. Możesz także wykonać matematykę dla danej pozycji przed użyciem jej do sprawdzenia tekstury, co powinno pozwolić ci na ponowne użycie tekstury, jeśli matematyka obejmuje stałą modułu cieniującego losowego na remis.
Znajdź jakąś matematyczną funkcję położenia przestrzeni ekranu, która daje wyniki „wystarczająco losowe”.
Szybkie wyszukiwanie w Google znalazło tę stronę z tymi funkcjami:
źródło
Oto jak generuję pseudolosowe liczby dla moich efektów cząsteczkowych za pomocą modułu obliczającego. Nie jestem pewien, jak naprawdę losowy jest ten kod, ale działa wystarczająco dobrze dla moich celów.
Kluczem do nadania każdemu jądru GPU jego własnej losowej sekwencji jest podanie modułowi obliczeniowemu początkowego losowego ziarna z procesora. Każde jądro używa następnie tego ziarna do przełączania generatora liczb przy użyciu jego identyfikatora wątku jako liczby. Stamtąd każdy wątek powinien mieć własne unikalne ziarno, aby wygenerować unikalne wartości.
źródło