Czy możliwe jest zaimplementowanie modułu cieniującego fragmenty w celu uzyskania rozmycia gaussowskiego? Znalazłem wiele implementacji rozmycia dwuprzebiegowego (rozmycie gaussowskie i rozmycie ramkowe):
- http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
- http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/
- http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/
i tak dalej.
Myślałem o zastosowaniu rozmycia gaussowskiego jako splotu (w rzeczywistości jest to splot, powyższe przykłady są jedynie przybliżeniami):
glsl
fragment-shader
blur
martin pilch
źródło
źródło
Sztuką szybkiego rozmycia gaussowskiego za pomocą GLSL jest wykorzystanie faktu, że GPU zapewnia interpolację liniową w sprzęcie. Dlatego możesz skutecznie próbkować cztery piksele 2D za pomocą pojedynczego pobrania wstępnego lub ośmiu wokseli 3D. Decydując, gdzie próbkować, możesz zważyć wynik. Ostatecznym odniesieniem jest „Szybkie filtrowanie tekstur trzeciego rzędu” Sigga i Hadwigera, które można znaleźć w Internecie.
Aby uzyskać czytelne wyjaśnienie, należy znaleźć stronę internetową „Efektywne rozmycie gaussowskie z próbkowaniem liniowym”. Jak zauważono, ponieważ rozmycie gaussowskie można rozdzielić szerokimi ziarnami, najskuteczniejsze jest wykonanie jednego przejścia na wymiar.
Możesz jednak użyć tej sztuczki, aby zbliżyć Gaussa z ciasnym jądrem w jednym przejściu. W poniższym przykładzie emuluję jądro 3D z górnym wycięciem = [1 2 1; 2 4 2; 1 2 1]; środkowy plasterek = [2 4 2; 4 8 4; 2 4 2]; dolny plasterek = [1 2 1; 2 4 2; 1 2 1]. Próbkując +/- 0,5 wokseli w każdym wymiarze, robisz to za pomocą 8 pobrań tekstur zamiast 27. Pokazuję to w GLSL jako plik modułu cieniującego MRIcroGL - po prostu upuść, zapisz poniższy skrypt jako „a.txt” i umieść go w Folder „Shader” MRIcroGL. Po ponownym uruchomieniu programu zobaczysz rozmazany obraz. Kliknięcie pola wyboru „doBlur” włącza i wyłącza rozmycie. Używanie zintegrowanego procesora graficznego Intel w laptopie i „chris_t1” obraz, który pochodzi z MRIcroGL Dostaję 70 klatek na sekundę bez rozmycia (1 pobieranie tekstury) i 21 klatek na sekundę z rozmyciem (8 pobrań). Większość kodu to tylko klasyczny rayaster, warunek „doBlur” zawiera w sobie twoje pytanie.
Następuje plik //-------a.txt
źródło