Próbuję stworzyć błyszczący efekt dla mojego modułu cieniującego w czasie rzeczywistym, ale nie wiem jak.
Oto jeden przykład i inny przykład .
Jakiej techniki mogę użyć, aby to zaimplementować?
Próbuję stworzyć błyszczący efekt dla mojego modułu cieniującego w czasie rzeczywistym, ale nie wiem jak.
Oto jeden przykład i inny przykład .
Jakiej techniki mogę użyć, aby to zaimplementować?
Odpowiedzi:
Cóż, kiedy zostaniemy poproszeni o zaprojektowanie dowolnego shadera, powinniśmy zacząć od podzielenia rzeczy na mniejsze problemy. I tak jak zauważamy, efekt połysku tak naprawdę nie sprawia, że shader wygląda dobrze, ale ogólne oświetlenie i efekt, użycie tylko jednego z nich nie będzie wyglądać tak dobrze.
Przede wszystkim określmy, co nie jest bezpośrednio częścią modułu cieniującego:
Po drugie, podzielmy rzeczywisty moduł cieniujący na osobne efekty:
Należy pamiętać, że takie tkaniny mają nieskończenie wiele normalnych, ale opisana tutaj technika jest zbliżona do najbardziej znaczącej normalnej
W celu zbliżenia najbardziej znaczący normalny, jeden sposób to zrobić, jest użycie współrzędnych tekstur i stycznych oblicz siatki, a zamiast obliczania N . L obliczasz 1- (NT).
Pełne wyjaśnienie tutaj . Prawdopodobnie musisz zaimplementować to w module cieniującym fragmenty, a nie w technice wierzchołków, o której mówią. Mogą również obowiązywać inne modele anizotropowe.
Teraz efekt połysku:
Można to zrobić w przestrzeni świata / lokalnej przestrzeni tekstur lub w przestrzeni ekranu jako osobne przejście.
Algorytm, który mogę wymyślić, wykorzystuje technikę przetwarzania obrazu (zakładając, że siatka ma współrzędne tekstury).
Zauważ, że powyższy obraz jest tylko przykładem filtra maksymalnego, a zastosowanie go do szumu da coś podobnego do pola gwiazdowego.
Przykład zastosowania filtra Gausiana dla maksymalnego (ed) hałasu.
Uwaga: ta technika może wymagać znacznej optymalizacji dla modułu cieniującego w czasie rzeczywistym.
Jest ciekawy artykuł AMD - Pierwsze procedury .
Wygląda na to, że iskierki są trudniejsze niż myślę.
Przyzwoite rozwiązanie: użyj pozycji 3D, aby zindeksować funkcję szumów 3D, dodaj wektor widoku, użyj funkcji frac, aby dalej losować.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);