Chcę wykonywać pełnoekranowe wygładzanie krawędzi w OpenGL i nie chcę używać wygładzania zapewnianego przez sam OpenGL, ponieważ tworzę grę i chcę w niej dobre efekty.
jak powinienem postąpić?
opengl
antialiasing
noddy
źródło
źródło
Odpowiedzi:
Istnieje kilka alternatyw dla natywnego MSAA w OpenGL. W przypadku efektów przetwarzania końcowego najlepszą rzeczą w nich jest to, że zwykle można po prostu wrzucić moduł cieniujący do końcowego, nieprzetworzonego obrazu, a on zrobi resztę. Oto trzy metody warte obejrzenia:
Szybki przybliżony antyaliasing (Geeks3D) - dobry w większości przypadków. Dość łatwy do zastosowania i zrozumienia. Wadą jest ostry, hałas o wysokim kontraście w teksturach jest nieco rozmazany. Krawędzie tak subtelne jak strome 1/4 1/4 wyglądają śmiertelnie dokładnie jak tradycyjny MSAA. Mniej stromy, ale traci trochę celności.
Normalne filtrowane wygładzanie krawędzi (GameDev ) - Nie przetestowałem jeszcze tego dokładnie, ale najłatwiej to zrozumieć. W najlepszych przypadkach przypomina 16x MSAA, aw najgorszych przypadkach jest jak 2x MSAA. Generuje tymczasową mapę normalną reprezentującą krawędzie i kąty względne. Możesz próbkować normalną mapę z różnicą luma lub różnicą kolorów.
Morfologiczne antyaliasing (Iryoku) - ulepszone do SMAA - Subpixel Mophological AA. Jest dość skomplikowany przy 4 przejściach, ale osiąga najlepsze wyniki, jakie widziałem. Tworzy gradienty wzdłuż krawędzi tak stopniowe, jak strome od 1/100 do 1/200 pikseli (!). Próbkowanie może być oparte na lumie, kolorze lub głębokości. Tekstury pozostają bardzo wyraźne i czyste. (przykład jest oparty na DX10 i HLSL, dokładne przeniesienie go do GLSL zajmuje trochę czasu)
Techniki te nie przeprowadzają superpróbkowania ani wielokrotnego próbkowania, więc linie o grubości mniejszej niż 1 piksel pojawią się z przerwami i nie będą poprawnie wygładzane. Jest to wada stosowania metody innej niż MSAA. Ponieważ pracujesz tylko z obrazem rastrowym w pełnej rozdzielczości, nie możesz tworzyć dodatkowych informacji z tych pustych luk.
Zauważ, że wszystkie te techniki zależą od próbkowania sąsiednich wartości lumy (jasności) lub barwy (koloru). Obliczanie lumy i opcjonalnej korekcji gamma wymaga dodatkowych instrukcji dotyczących modułu cieniującego AA, choć jest to dość proste. Możesz to odciążyć, obliczając lumę w poprzednim module cieniującym, który zapewnia niezretuszowany obraz, przechowując lumę w kanale alfa. Następnie w shaderze AA po prostu spróbujesz alfa.
źródło
Istnieje wiele sposobów na wygładzanie krawędzi. Jednym z nich jest użycie antyaliasingu wielopróbkowego (MSAA), w którym bufor tylny faktycznie przechowuje wiele próbek subpikseli, a podczas renderowania trójkątów, linii itp. System automatycznie wypełnia prawidłowy zestaw próbek w każdym pikselu. Następnie pod koniec renderowania obraz jest „rozwiązany” przez uśrednienie wszystkich próbek subpikseli, aby uzyskać jedną próbkę na piksel.
Innym sposobem jest użycie antyaliasingu przetwarzania końcowego, w którym renderujesz scenę w normalny sposób, a następnie wykonujesz ukierunkowane rozmycie w wyniku końcowym, aby ukryć aliasy. Jest na to wiele technik, ale jedna z najlepszych / najpopularniejszych w tej chwili nazywa się FXAA (szybkie podejście antyaliasingowe).
MSAA zazwyczaj daje lepiej wyglądające wyniki niż końcowe przetwarzanie AA, ale może być wolniejsze, ponieważ wymaga około dwukrotnie większej przepustowości pamięci dla każdej operacji renderowania. MSAA może również wymagać więcej pamięci wideo niż post-processing AA, w zależności od szczegółów konfiguracji.
Szczegółowe informacje na temat wdrażania MSAA lub FXAA można znaleźć w Internecie - wystarczy wyszukać w Google jeden z tych warunków.
źródło
Czy chcesz kodować własny moduł cieniujący GLSL? Jeśli tak, sprawdź ten samouczek.
źródło