Menu
Jest wolny
rejestracja
Dom  /  Internet/ Shader - co to jest? Rodzaje, zalety i wady. Czym są shadery i jak zainstalować shadery na Minecraft Gdzie mogę pobrać Optifine?

Shader – co to jest? Rodzaje, zalety i wady. Czym są shadery i jak zainstalować shadery na Minecraft Gdzie mogę pobrać Optifine?

Wstęp

Świat grafiki 3D, w tym gier, jest pełen terminów. Terminy, które nie zawsze mają jedyną poprawną definicję. Czasami te same rzeczy są nazywane inaczej i na odwrót, ten sam efekt można nazwać „HDR”, „Rozkwit”, „Poświata”, a następnie „Przetwarzanie końcowe” w ustawieniach gry. Większość ludzi, z przechwałek deweloperów o tym, co wbudowali w swój silnik graficzny, jest zdezorientowanych, co naprawdę mają na myśli.

Artykuł ma na celu pomóc Ci dowiedzieć się, co oznaczają niektóre z tych słów, najczęściej używane w takich przypadkach. W ramach tego artykułu nie będziemy mówić o wszystkich terminach grafiki 3D, ale tylko o tych, które stały się bardziej rozpowszechnione w ostatnich latach jako wyróżniające cechy i technologie stosowane w silnikach graficznych gier oraz jako nazwy ustawień graficznych współczesnych gier . Na początek gorąco polecam zapoznanie się.

Jeśli coś w tym artykule i artykułach Aleksandra nie jest dla ciebie jasne, warto zacząć od najwcześniej, s. Te artykuły są już oczywiście nieco nieaktualne, ale są tam podstawowe, najbardziej początkowe i ważne dane. Porozmawiamy z Tobą o bardziej „wyższych” terminach. Powinieneś mieć podstawową wiedzę na temat grafiki 3D w czasie rzeczywistym i potoku graficznego. Z drugiej strony, nie oczekuj formuł matematycznych, akademickiej precyzji i przykładów kodu - w ogóle nie o tym jest ten artykuł. Warunki

Lista terminów opisanych w artykule:

Shader

Shader w szerokim znaczeniu to program do wizualnego definiowania powierzchni obiektu. Może to być opis oświetlenia, teksturowania, przetwarzania końcowego itp. Shadery wyewoluowały z drzew cieni Cooka i języka strumieni pikseli Perlina. RenderMan Shading Language jest teraz najbardziej znany. Programowalne shadery zostały po raz pierwszy wprowadzone w RenderMan Pixara, który definiuje kilka typów shaderów: shadery źródła światła, shadery powierzchni, shadery przemieszczenia, shadery głośności, imager shadery.Te shadery są najczęściej wykonywane w oprogramowaniu przez procesory ogólnego przeznaczenia i nie mają pełnej implementacji sprzętowej.Później wielu badaczy opisywało języki podobne do RenderMan, ale zostały już zaprojektowane dla przyspieszenie sprzętowe: system PixelFlow (Olano i Lastra), język Quake Shader (używany przez id Software w silniku graficznym Quake III, który opisywał renderowanie wieloprzebiegowe) i inne. Peercy i współpracownicy opracowali technikę zapętlania i warunkowego wykonywania programów na tradycyjnych architekturach sprzętowych z wieloma przebiegami renderowania. Shadery RenderMana zostały podzielone na wiele przejść, które zostały połączone w buforze ramki. Później pojawiły się języki, w których widzimy akcelerację sprzętową w DirectX i OpenGL. W ten sposób shadery zostały przystosowane do aplikacji graficznych w czasie rzeczywistym.

Wczesne chipy wideo nie były programowalne i wykonywały tylko wstępnie zaprogramowane działania (funkcja stała), na przykład algorytm oświetlenia był sztywno ustalony w sprzęcie i nic nie można było zmienić. Następnie producenci chipów wideo stopniowo wprowadzali do swoich chipów elementy programowalne, początkowo były to bardzo słabe możliwości (NV10, znany jako NVIDIA GeForce 256, był już zdolny do niektórych prymitywnych programów), które nie otrzymały wsparcia programowego w Microsoft DirectX API, ale z biegiem czasu możliwości stale się poszerzają. Następny krok dotyczył zarówno NV20 (GeForce 3), jak i NV2A (układ wideo używany w konsola do gier Microsoft Xbox), które stały się pierwszymi układami ze sprzętową obsługą shaderów DirectX API. Wersja Shader Model 1.0/1.1, która pojawiła się w DirectX 8, była bardzo ograniczona, każdy shader (szczególnie pikselowy) mógł być stosunkowo krótki i łączyć bardzo ograniczony zestaw instrukcji. Później Shader Model 1 (w skrócie SM1) został ulepszony o Pixel Shaders 1.4 (ATI R200), który oferował większą elastyczność, ale miał też zbyt ograniczone możliwości. Shadery z tamtych czasów zostały napisane w tak zwanym języku asemblera, który jest zbliżony do języka asemblera dla procesorów ogólnego przeznaczenia. Jej niski poziom powoduje pewne trudności w zrozumieniu kodu i programowania, zwłaszcza gdy kod programu jest duży, gdyż daleko mu do elegancji i ustrukturyzowania współczesnych języków programowania.

Wersja Shader Model 2.0 (SM2), która pojawiła się w DirectX 9 (wspierana przez układ wideo ATI R300, który stał się pierwszym GPU z obsługą shaderów model 2.0), znacznie rozszerzyła możliwości shaderów czasu rzeczywistego, oferując dłuższe i bardziej złożone shadery oraz znacznie rozszerzony zestaw instrukcji. Dodano możliwość obliczania liczby zmiennoprzecinkowej w shaderach pikseli, co również było dużym ulepszeniem. DirectX 9, w obliczu możliwości SM2, wprowadził również język cieniowania wysokiego poziomu (HLSL), który jest bardzo podobny do języka C. Oraz wydajny kompilator, który tłumaczy programy HLSL na niskopoziomowy, przyjazny dla sprzętu kod. Ponadto dostępnych jest kilka profili dla różnych architektur sprzętowych. Teraz programista może napisać jeden kod modułu cieniującego HLSL i skompilować go za pomocą DirectX do programu optymalnego dla układu wideo zainstalowanego przez użytkownika. Potem pojawiły się układy od NVIDII, NV30 i NV40, które o krok dalej poprawiły możliwości sprzętowych shaderów, dodając jeszcze dłuższe shadery, możliwość dynamicznych przejść w vertexach i pixel shaderach, możliwość pobierania tekstur z vertex shaderów itp. nie były, spodziewane są pod koniec 2006 roku w DirectX 10...

Ogólnie rzecz biorąc, shadery dodały wiele nowych możliwości do potoku graficznego w zakresie przekształcania i oświetlania wierzchołków oraz indywidualnego przetwarzania pikseli, zgodnie z życzeniem twórców poszczególnych aplikacji. A jednak możliwości sprzętowych shaderów nie zostały jeszcze w pełni ujawnione w aplikacjach, a wraz ze wzrostem ich możliwości z każdą nową generacją sprzętu wkrótce zobaczymy poziom tych właśnie shaderów RenderMan, które kiedyś wydawały się nieosiągalne dla akceleratorów wideo do gier. Jak dotąd w modelach shaderów czasu rzeczywistego obsługiwanych przez sprzętowe akceleratory wideo zdefiniowane są tylko dwa typy shaderów: i (w definicji interfejsu API DirectX 9). DirectX 10 zapowiada się do nich w przyszłości.

Vertex Shader

Vertex Shader to programy wykonywane przez chipy wideo, które wykonują operacje matematyczne na wierzchołkach (wierzchołki, tworzą obiekty 3D w grach), czyli dają możliwość wykonywania programowalnych algorytmów zmiany parametrów wierzchołków i ich oświetlenia (T&L - Transformacja i oświetlenie) ... Każdy wierzchołek jest zdefiniowany przez kilka zmiennych, na przykład położenie wierzchołka w przestrzeni 3D jest określone przez współrzędne: x, y i z. Wierzchołki można również opisać za pomocą cech koloru, współrzędnych tekstury i tym podobnych. Vertex Shadery w zależności od algorytmów zmieniają te dane w trakcie swojej pracy, np. obliczając i zapisując nowe współrzędne i/lub kolor. Oznacza to, że dane wejściowe modułu Vertex Shader to dane dotyczące jednego wierzchołka modelu geometrycznego, który jest aktualnie przetwarzany. Zazwyczaj są to współrzędne przestrzenne, normalne, składowe koloru i współrzędne tekstury. Wynikowe dane wykonywanego programu służą jako dane wejściowe dla dalszej części potoku, rasteryzator dokonuje liniowej interpolacji danych wejściowych dla powierzchni trójkąta i dla każdego piksela wykonuje odpowiedni pixel shader. Bardzo prosty i szorstki (ale mam nadzieję jasny) przykład: Vertex Shader pozwala wziąć obiekt sferyczny 3D i użyć Vertex Shadera, aby zrobić z niego zielony sześcian :).

Przed pojawieniem się układu wideo NV20 programiści mieli dwa sposoby: albo używać własnych programów i algorytmów zmieniających parametry wierzchołków, ale wtedy wszystkie obliczenia byłyby wykonywane przez procesor (oprogramowanie T&L) lub polegać na stałych algorytmy w chipach wideo, z obsługą transformacji sprzętowej i oświetlenia (hardware T&L ). Pierwszy model modułu cieniującego DirectX stanowił duży krok naprzód od stałych funkcji przekształcania i oświetlania wierzchołków do w pełni programowalnych algorytmów. Możliwe stało się na przykład wykonanie algorytmu skórowania całkowicie na chipach wideo, a wcześniej jedyną możliwością było ich wykonanie na uniwersalnych procesorach centralnych. Teraz, z możliwościami znacznie poprawionymi od czasu wspomnianego układu NVIDII, możesz wiele zrobić z wierzchołkami za pomocą Vertex Shaderów (może z wyjątkiem ich tworzenia) ...

Przykłady, jak i gdzie są stosowane Vertex Shader:

Pixel Shader

Pixel shadery to programy wykonywane przez układ wideo podczas rasteryzacji dla każdego piksela na obrazie; wykonują one próbkowanie tekstury i/lub operacje matematyczne na wartości koloru i głębi (buforze Z) pikseli. Wszystkie instrukcje programu pixel shader są wykonywane piksel po pikselu po zakończeniu transformacji geometrii i operacji oświetlenia. W wyniku swojej pracy pixel shader generuje ostateczną wartość koloru piksela i wartość Z dla następnego etapu potoku graficznego, mieszania. Najprostszy przykład pixel shadera, jaki można przytoczyć: banalne multiteksturowanie, po prostu mieszanie dwóch tekstur (na przykład diffuse i lightmap) i narzucanie wyniku obliczeń na piksel.

Przed pojawieniem się chipów wideo ze sprzętową obsługą shaderów pikseli programiści mieli tylko możliwości konwencjonalnego multiteksturowania i mieszania alfa, co znacznie ograniczało możliwości wielu efektów wizualnych i nie pozwalało na wiele z tego, co jest teraz dostępne. A jeśli z geometrią można programowo zrobić coś innego, to z pikselami – nie. Wczesny Wersje DirectX(do 7,0 włącznie) zawsze wykonywał wszystkie obliczenia w pionie i oferował bardzo ograniczoną funkcjonalność dla oświetlenia na piksel (pamiętaj EMBM - mapowanie wypukłości środowiska i DOT3) w najnowszych wersjach. Pixel shadery umożliwiły oświetlanie dowolnej powierzchni piksel po pikselu przy użyciu materiałów zaprogramowanych przez programistów. Pixel shadery 1.1 (w sensie DirectX), które pojawiły się w NV20, potrafiły nie tylko wykonywać multiteksturowanie, ale także znacznie więcej, chociaż większość gier korzystających z SM1 po prostu używało tradycyjnego multiteksturowania na większości powierzchni, wykonując bardziej złożone pixel shadery tylko na części powierzchni, do tworzenia różnorodnych efektów specjalnych (każdy wie, że woda jest nadal najczęstszym przykładem zastosowania pixel shaderów w grach). Teraz, po pojawieniu się SM3 i obsługujących je chipów wideo, możliwości pixel shaderów wzrosły, aby umożliwić nawet śledzenie promieni, choć z pewnymi ograniczeniami.

Przykłady korzystania z shaderów pikseli:

Tekstury proceduralne

Tekstury proceduralne to tekstury opisane wzorami matematycznymi. Takie tekstury nie zajmują miejsca w pamięci wideo, są tworzone przez pixel shader „w locie”, każdy z ich elementów (texel) jest uzyskiwany w wyniku wykonania odpowiednich poleceń shadera. Najczęstsze tekstury proceduralne to: różne rodzaje hałas (np. szum fraktalny), drewno, woda, lawa, dym, marmur, ogień itp., czyli takie, które można stosunkowo prosto opisać matematycznie. Tekstury proceduralne pozwalają również na używanie tekstur animowanych z niewielką modyfikacją wzorów matematycznych. Na przykład chmury wykonane w ten sposób wyglądają całkiem przyzwoicie zarówno pod względem dynamiki, jak i statyki.

Zaletami tekstur proceduralnych jest również nieograniczony poziom szczegółowości każdej tekstury, po prostu nie będzie pikselizacji, tekstura jest zawsze generowana zgodnie z rozmiarem wymaganym do jej wyświetlenia. Dużym zainteresowaniem cieszą się również animacje, za ich pomocą można tworzyć fale na wodzie, bez użycia wstępnie obliczonych animowanych tekstur. Kolejnym plusem takich tekstur jest to, że im częściej są używane w produkcie, tym mniej pracy dla artystów (choć więcej dla programistów) przy tworzeniu zwykłych tekstur.

Niestety tekstury proceduralne nie zostały jeszcze właściwie wykorzystane w grach, w rzeczywistych aplikacjach wciąż często łatwiej jest załadować zwykłą teksturę, wolumeny pamięci wideo rosną skokowo, w najnowocześniejszych akceleratorach instalują już 512 megabajtów dedykowanego wideo pamięć, która jest potrzebna bardziej niż pożyczenie czegoś. Co więcej, nadal często robią odwrotnie - aby przyspieszyć matematykę w pixel shaderach, stosuje się tablice przeglądowe (LUT) - specjalne tekstury zawierające wstępnie obliczone wartości uzyskane w wyniku obliczeń. Aby nie liczyć kilku instrukcji matematycznych dla każdego piksela, po prostu odczytują wstępnie obliczone wartości z tekstury. Ale im dalej, tym większy nacisk powinien zostać położony na obliczenia matematyczne, weźmy te same chipy wideo ATI nowej generacji: RV530 i R580, które mają procesory 12 i 48 pikseli na każde 4 i 16 jednostek tekstury. Co więcej, jeśli mówimy o teksturach 3D, bo jeśli dwuwymiarowe tekstury można bez problemu umieścić w pamięci lokalnej akceleratora, to tekstury 3D wymagają tego znacznie więcej.

Przykłady tekstur proceduralnych:

Mapowanie wypukłości / Mapowanie wypukłości zwierciadlanych

Bumpmapping to technika symulowania nieregularności (lub modelowania mikroreliefu, jak chcesz) na płaskiej powierzchni bez dużych kosztów obliczeniowych i zmian geometrii. Dla każdego piksela na powierzchni wykonywane jest obliczenie oświetlenia na podstawie wartości ze specjalnej mapy wysokości zwanej bumpmapą. Jest to zwykle 8-bitowa czarno-biała tekstura, a wartości kolorów tekstury nie są nakładane jak zwykłe tekstury, ale są używane do opisu chropowatości powierzchni. Kolor każdego tekselu określa wysokość odpowiedniego punktu reliefu, wyższe wartości oznaczają wyższą wysokość nad pierwotną powierzchnią, a niższe wartości odpowiednio niższe. Lub odwrotnie.

Stopień oświetlenia punktu zależy od kąta padania promieni świetlnych. Im mniejszy kąt między normalną a promieniem światła, tym większe oświetlenie punktu na powierzchni. Oznacza to, że jeśli weźmiesz płaską powierzchnię, normalne w każdym punkcie będą takie same, a oświetlenie również będzie takie samo. A jeśli powierzchnia jest nierówna (w rzeczywistości prawie wszystkie powierzchnie są w rzeczywistości), to normalne w każdym punkcie będą różne. A iluminacja jest inna, w jednym momencie będzie więcej, w innym - mniej. Stąd zasada bumpmappingu - aby symulować nieregularności dla różnych punktów wielokąta, ustawiane są normalne powierzchni, które są brane pod uwagę przy obliczaniu oświetlenia na piksel. W rezultacie uzyskuje się bardziej naturalny obraz powierzchni, bumpmapping daje powierzchniom więcej szczegółów, takich jak wypukłości na cegłach, pory na skórze itp., bez zwiększania złożoności geometrycznej modelu, ponieważ obliczenia są przeprowadzane na poziom pikseli. Co więcej, gdy zmienia się położenie źródła światła, oświetlenie tych nieregularności zmienia się prawidłowo.

Oczywiście oświetlenie wierzchołków jest znacznie prostsze obliczeniowo, ale wygląda zbyt nierealistycznie, zwłaszcza przy stosunkowo niskiej geometrii, interpolacja kolorów dla każdego piksela nie może odtworzyć wartości większych niż obliczone wartości dla wierzchołków. Oznacza to, że piksele w środku trójkąta nie mogą być jaśniejsze niż fragmenty w pobliżu wierzchołka. W związku z tym obszary z nagłymi zmianami oświetlenia, takie jak odblaski i źródła światła znajdujące się bardzo blisko powierzchni, będą fizycznie nieprawidłowo wyświetlane, co będzie szczególnie widoczne w dynamice. Oczywiście problem można częściowo rozwiązać, zwiększając złożoność geometryczną modelu, dzieląc go na więcej wierzchołków i trójkątów, ale najlepszym rozwiązaniem jest oświetlenie piksel po pikselu.

Aby kontynuować, musisz przywołać komponenty oświetlenia. Kolor punktu na powierzchni jest obliczany jako suma składowych otoczenia, rozproszenia i zwierciadlanych ze wszystkich źródeł światła w scenie (najlepiej ze wszystkich, często pomijanych przez wielu). Udział każdego źródła światła w tej wartości zależy od odległości między źródłem światła a punktem na powierzchni.

Elementy oświetleniowe:

Teraz dodajmy do tego mapowanie wypukłości:

Jednolity (otoczny) składnik oświetlenia jest przybliżonym, „początkowym” oświetleniem dla każdego punktu sceny, w którym wszystkie punkty są oświetlone równomiernie, a oświetlenie nie zależy od innych czynników.
Rozproszona składowa światła zależy od położenia źródła światła i od normalnej powierzchni. Ten komponent oświetlenia jest inny dla każdego wierzchołka obiektu, co nadaje mu objętość. Światło nie wypełnia już powierzchni tym samym odcieniem.
Zwierciadlany składnik oświetlenia pojawia się jako odbicie promieni świetlnych od powierzchni. Do jego obliczeń, oprócz wektora położenia źródła światła i normalnej, stosuje się jeszcze dwa wektory: wektor kierunku spojrzenia i wektor odbicia. Model oświetlenia Specular został po raz pierwszy zaproponowany przez Phong Bui-Tong. Te odblaski znacznie zwiększają realizm obrazu, ponieważ rzadkie rzeczywiste powierzchnie nie odbijają światła, więc składnik zwierciadlany jest bardzo ważny. Zwłaszcza w ruchu, bo odblask natychmiast pokazuje zmianę położenia kamery lub samego obiektu. Później badacze wymyślili inne sposoby obliczania tego składnika, bardziej złożone (Blinn, Cook-Torrance, Ward), biorąc pod uwagę rozkład energii światła, jego pochłanianie przez materiały i rozpraszanie w postaci składnika rozproszonego.

Tak więc, Specular Bump Mapping uzyskuje się w ten sposób:

Zobaczmy to samo na przykładzie gry Call of Duty 2:


Pierwszy fragment obrazu jest renderowany bez bumpmappingu (), drugi (prawy górny róg) to bumpmapping bez składnika zwierciadlanego, trzeci z elementem zwierciadlanym normalnej wielkości, który jest używany w grze, a ostatni , od prawego dolnego rogu, z maksymalną możliwą składową zwierciadlaną.

Jeśli chodzi o pierwszą aplikację sprzętową, niektóre rodzaje bumpmappingu (Emboss Bump Mapping) zaczęły być używane w czasach kart graficznych opartych na układach NVIDIA Riva TNT, ale techniki tamtych czasów były niezwykle prymitywne i nie były powszechnie stosowane. Następnym znanym typem było Environment Mapped Bump Mapping (EMBM), ale tylko karty graficzne Matrox miały w tym czasie obsługę sprzętową w DirectX i ponownie użycie było poważnie ograniczone. Potem pojawiło się Dot3 Bump Mapping, a układy wideo z tamtych czasów (GeForce 256 i GeForce 2) wymagały trzech przejść, aby całkowicie wykonać taki matematyczny algorytm, ponieważ są one ograniczone przez dwie tekstury używane jednocześnie. Począwszy od NV20 (GeForce3), stało się możliwe zrobienie tego samego w jednym przejściu przy użyciu shaderów pikseli. Ponadto. Zaczęli stosować bardziej efektywne techniki, takie jak.

Przykłady użycia bumpmappingu w grach:


Mapowanie przemieszczeń to metoda dodawania szczegółów do obiektów 3D. W przeciwieństwie do bumpmappingu i innych metod per-pixel, gdy tylko oświetlenie punktu jest poprawnie modelowane przez mapy wysokości, ale jego położenie w przestrzeni nie zmienia się, co daje jedynie złudzenie wzrostu złożoności powierzchni, mapy przemieszczeń pozwalają uzyskać rzeczywiste, złożone obiekty 3D z wierzchołków i wielokątów, bez ograniczeń związanych z metodami na piksel. Ta metoda zmienia położenie wierzchołków trójkątów, normalizując je o wartość opartą na wartościach na mapach przemieszczeń. Mapa przemieszczeń to zazwyczaj czarno-biała tekstura, a wartości w niej zawarte służą do określenia wysokości każdego punktu na powierzchni obiektu (wartości mogą być przechowywane jako liczby 8-bitowe lub 16-bitowe) , podobny do bumpmap. Mapy przemieszczeń są często używane (w tym przypadku nazywane są również mapami wysokości) do tworzenia terenu ze wzgórzami i dolinami. Ponieważ teren jest opisywany dwuwymiarową mapą przemieszczeń, stosunkowo łatwo jest go w razie potrzeby zdeformować, ponieważ wymagałoby to jedynie modyfikacji mapy przemieszczeń i renderowania na jej podstawie powierzchni w następnej ramce.

Tworzenie krajobrazu za pomocą nakładki map przemieszczeń jest wyraźnie pokazane na rysunku. Początkowo wykorzystano 4 wierzchołki i 2 wielokąty, w wyniku czego powstał pełnoprawny kawałek krajobrazu.

Dużą zaletą nakładania map przemieszczeń jest nie tylko możliwość dodawania szczegółów do powierzchni, ale prawie całkowite stworzenie obiektu. Obiekt low-poly jest brany, dzielony (teselowany) na więcej wierzchołków i wielokątów. Wierzchołki powstałe w wyniku teselacji są następnie przemieszczane wzdłuż normalnej na podstawie wartości odczytanej z mapy przemieszczeń. Z prostego obiektu otrzymujemy złożony obiekt 3D, korzystając z odpowiedniej mapy przemieszczeń:


Liczba trójkątów utworzonych przez teselację musi być wystarczająco duża, aby uchwycić wszystkie szczegóły określone przez mapę przemieszczeń. Czasami dodatkowe trójkąty są tworzone automatycznie przy użyciu N-łat lub innych metod. Mapy przemieszczeń najlepiej stosować w połączeniu z mapowaniem wypukłości, aby uzyskać drobne szczegóły tam, gdzie wystarczające jest odpowiednie oświetlenie piksel po pikselu.

Mapowanie przemieszczeń było po raz pierwszy obsługiwane w DirectX 9.0. To była pierwsza wersja tego interfejsu API obsługująca technikę Displacement Mapping. DX9 obsługuje dwa rodzaje mapowania przemieszczeń, filtrowane i wstępnie próbkowane. Pierwsza metoda była obsługiwana przez zapomniany układ wideo MATROX Parhelia, a druga - przez ATI RADEON 9700. Metoda filtrowana różni się tym, że pozwala na użycie poziomów mip dla map przemieszczeń i zastosowanie dla nich filtrowania trójliniowego. W tej metodzie poziom mip mapy przemieszczeń jest wybierany dla każdego wierzchołka na podstawie odległości od wierzchołka do kamery, co oznacza, że ​​poziom szczegółowości jest wybierany automatycznie. Daje to prawie równomierny podział sceny, gdy trójkąty są w przybliżeniu tej samej wielkości.

Mapowanie przemieszczeń można zasadniczo traktować jako technikę kompresji geometrii; korzystanie z map przemieszczeń zmniejsza ilość pamięci wymaganej dla określonego poziomu szczegółowości modelu 3D. Masowe dane geometryczne są zastępowane prostymi teksturami przemieszczenia 2D, zwykle 8-bitowymi lub 16-bitowymi. Zmniejsza to ilość pamięci i przepustowość wymaganą do dostarczenia danych geometrycznych do układu wideo, a te ograniczenia są jednymi z głównych ograniczeń w dzisiejszych systemach. Alternatywnie, przy równych wymaganiach dotyczących przepustowości i pamięci, mapowanie przemieszczeń pozwala na tworzenie znacznie bardziej złożonych geometrycznych modeli 3D. Wykorzystanie modeli o znacznie mniejszej złożoności, gdzie zamiast dziesiątek czy setek tysięcy trójkątów używa się jednostek tysięcy, pozwala również na przyspieszenie ich animacji. Lub ulepsz go, stosując bardziej złożone algorytmy i techniki, takie jak symulacja tkaniny.

Kolejną zaletą jest to, że używanie map przemieszczeń zamienia złożone wielokątne siatki 3D w wiele tekstur 2D, którymi łatwiej manipulować. Na przykład, dla organizacji, możesz użyć zwykłego mip-mappingu, aby nałożyć mapy przemieszczeń. Ponadto zamiast stosunkowo skomplikowanych algorytmów kompresji siatek trójwymiarowych można użyć zwykłych metod kompresji tekstur, nawet podobnych do JPEG. A do proceduralnego tworzenia obiektów 3D możesz użyć zwykłych algorytmów dla tekstur 2D.

Ale mapy przemieszczeń mają też pewne ograniczenia, nie można ich zastosować we wszystkich sytuacjach. Na przykład gładkie obiekty, które nie zawierają wielu drobnych szczegółów, będą lepiej reprezentowane jako standardowe siatki lub inne powierzchnie wyższego poziomu, takie jak krzywe Beziera. Z drugiej strony bardzo złożone modele, takie jak drzewa czy rośliny, również nie są łatwe do odwzorowania za pomocą map przemieszczeń. Pojawiają się też problemy z wygodą ich użytkowania, to prawie zawsze wymaga specjalistycznych narzędzi, ponieważ bardzo trudno jest bezpośrednio tworzyć mapy przemieszczeń (jeśli nie mówimy o prostych obiektach, takich jak krajobraz). Wiele nieodłącznych problemów i ograniczeń map przemieszczeń jest takich samych jak te, ponieważ te dwie metody są zasadniczo dwiema różnymi reprezentacjami podobnej idei.

Jako przykład z prawdziwych gier przytoczę grę, która wykorzystuje próbkowanie tekstur z Vertex Shadera, funkcji, która pojawiła się w układach wideo NVIDIA NV40 i Shader Model 3.0. Teksturowanie wierzchołków można zastosować do w pełni wykonanego GPU prosta metoda nakładaj mapy przemieszczeń, bez teselacji (podział na więcej trójkątów). Zastosowanie takiego algorytmu jest ograniczone, mają sens tylko wtedy, gdy mapy są dynamiczne, czyli będą się zmieniać w procesie. Na przykład jest to renderowanie dużych powierzchni wody, które jest wykonywane w grze Pacific Fighters:


Normalmapping to ulepszona wersja opisanej wcześniej techniki bumpmapping, jej rozszerzona wersja. Bumpmapping został opracowany przez Blinna w 1978 roku, gdzie normalne powierzchni są zmieniane za pomocą tej metody mapowania terenu na podstawie informacji z map wypukłości. Podczas gdy bumpmapping zmienia tylko istniejącą normalną dla punktów powierzchni, normalmapping całkowicie zastępuje normalne poprzez pobranie ich wartości ze specjalnie przygotowanej mapy normalnych. Mapy te to zazwyczaj tekstury z zapisanymi w nich wstępnie obliczonymi wartościami normalnymi, reprezentowanymi jako składowe kolorów RGB (istnieją jednak również specjalne formaty dla map normalnych, w tym te z kompresją), w przeciwieństwie do 8-bitowej wysokości czarno-białej mapy w bumpmappingu.

Ogólnie, podobnie jak bump mapping, jest to również „tani” sposób dodawania szczegółów do modeli o stosunkowo niskiej złożoności geometrycznej, bez użycia bardziej rzeczywistej geometrii, tylko bardziej zaawansowana. Jednym z najciekawszych zastosowań tej techniki jest znaczne zwiększenie szczegółowości modeli low-poly przy użyciu map normalnych uzyskanych w wyniku przetwarzania tego samego modelu o wysokiej złożoności geometrycznej. Mapy normalnych zapewniają bardziej szczegółowy opis powierzchni niż bumpmapping i umożliwiają reprezentowanie bardziej złożonych kształtów. Pomysły na pozyskiwanie informacji z bardzo szczegółowych obiektów pojawiły się w połowie lat 90. ubiegłego wieku, ale wtedy chodziło o użycie for. Później, w 1998 roku, pojawiły się pomysły na przeniesienie szczegółów w postaci map normalnych z modeli high-poly do modeli low-poly.

Mapy normalnych zapewniają wydajniejszy sposób przechowywania szczegółowych danych powierzchni niż zwykłe używanie dużej liczby wielokątów. Ich jedynym poważnym ograniczeniem jest to, że niezbyt dobrze nadają się do dużych detali, ponieważ normalne mapowanie w rzeczywistości nie dodaje wielokątów ani nie zmienia kształtu obiektu, a jedynie tworzy jego wygląd. To tylko symulacja szczegółów oparta na obliczeniach oświetlenia na poziomie pikseli. Przy skrajnych wielokątach obiektu i dużych kątach nachylenia powierzchni jest to bardzo zauważalne. Dlatego najbardziej rozsądnym sposobem zastosowania mapowania normalnych jest uczynienie modelu low poly wystarczająco szczegółowym, aby zachować podstawowy kształt obiektu, oraz użycie map normalnych w celu dodania drobniejszych szczegółów.

Normalne mapy są zwykle generowane z dwóch wersji modelu, low i high poly. Model low poly składa się z minimum geometrii, podstawowych kształtów obiektu, a model high poly zawiera wszystko, czego potrzebujesz, aby uzyskać maksymalną szczegółowość. Następnie, używając specjalne narzędzia są one porównywane ze sobą, różnica jest obliczana i przechowywana w teksturze zwanej mapą normalną. Przy jej tworzeniu można dodatkowo użyć mapy wypukłości dla bardzo małych detali, których nie da się wymodelować nawet w modelu high-poly (pory skóry, inne małe zagłębienia).

Mapy normalnych były pierwotnie reprezentowane jako zwykłe tekstury RGB, w których składowe kolorów R, G i B (od 0 do 1) są interpretowane jako współrzędne X, Y i Z. Każdy teksel na mapie normalnych jest reprezentowany jako normalna punktu powierzchni. Mapy normalne mogą być dwojakiego rodzaju: ze współrzędnymi w przestrzeni modelu (ogólny układ współrzędnych) lub w przestrzeni stycznej (termin w języku rosyjskim to „przestrzeń styczna”, lokalny układ współrzędnych trójkąta). Druga opcja jest częściej używana. Kiedy normalne mapy są prezentowane w przestrzeni modelu, muszą mieć trzy komponenty, ponieważ wszystkie kierunki mogą być reprezentowane, a gdy w lokalnym układzie współrzędnych, w przestrzeni stycznej, można obejść się z dwoma komponentami i uzyskać trzecią w pixel shaderze .

Nowoczesne aplikacje czasu rzeczywistego wciąż znacznie przewyższają pre-renderowane animacje pod względem jakości obrazu, dotyczy to przede wszystkim jakości oświetlenia i geometrycznej złożoności scen. Liczba wierzchołków i trójkątów obliczanych w czasie rzeczywistym jest ograniczona. Dlatego bardzo ważne są metody zmniejszania ilości geometrii. Przed normalnym mapowaniem opracowano kilka takich metod, ale modele low poly nawet z bumpmappingiem są znacznie gorsze niż bardziej złożone modele. Chociaż normalne mapowanie ma kilka wad (najbardziej oczywistym jest to, że ponieważ model jest niskopolimerowy, można go łatwo zobaczyć z jego krawędzi kątowych), ostateczna jakość renderowania jest zauważalnie poprawiona, pozostawiając geometryczną złożoność modeli na niskim poziomie. W ostatnim czasie wyraźnie widać wzrost popularności tej techniki i jej zastosowanie we wszystkich popularnych silnikach gier. Wynika to z połączenia doskonałej jakości wyników z jednoczesnym zmniejszeniem wymagań dotyczących złożoności geometrycznej modeli. Normalna technika mapowania jest teraz używana prawie wszędzie, wszystkie nowe gry używają jej tak szeroko, jak to możliwe. Oto krótka lista znanych gier na PC używających normalnego mapowania: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, FEAR, Quake 4. Wszystkie wyglądają znacznie lepiej niż gry z przeszłości, m.in. wykorzystanie map normalnych.

Negatywna konsekwencja stosowania tej techniki jest tylko jedna - zwiększenie objętości tekstur. W końcu mapa normalnych silnie wpływa na wygląd obiektu i musi mieć wystarczająco dużą rozdzielczość, więc wymagania dotyczące pamięci wideo i jej przepustowości są podwojone (w przypadku nieskompresowanych map normalnych). Ale teraz produkowane są już karty wideo z 512 megabajtami pamięci lokalnej, wydajność stale się rozwija, metody kompresji zostały opracowane specjalnie dla normalnych map, więc te małe ograniczenia nie są tak naprawdę ważne. Efekt normalnego mapowania jest znacznie większy, co pozwala na użycie modeli o stosunkowo niskiej poli, zmniejszając wymagania dotyczące pamięci do przechowywania danych geometrycznych, poprawiając wydajność i dając bardzo przyzwoity wynik wizualny.

Mapowanie paralaksy / mapowanie offsetowe

Mapowanie normalne, opracowane w 1984 roku, zostało poprzedzone mapowaniem Relief Texture, wprowadzonym przez Oliverę i Bishopa w 1999 roku. Jest to technika mapowania tekstur oparta na informacjach o głębokości. Metoda nie znalazła zastosowania w grach, ale jej pomysł przyczynił się do kontynuacji prac nad mapowaniem paralaksy i jego doskonaleniem. Kaneko wprowadził mapowanie paralaksy w 2001 roku, które było pierwszą wydajną metodą renderowania efektu paralaksy w pikselach. W 2004 roku Welsh zademonstrował zastosowanie mapowania paralaksy na programowalnych układach wideo.

Ta metoda ma prawdopodobnie najbardziej różne nazwy. Wymienię te, które spotkałem: Mapping Parallax, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. Pierwszy tytuł został użyty w artykule dla zwięzłości.
Mapowanie paralaksy to kolejna alternatywa dla mapowania wypukłości i normalnych technik mapowania, która zapewnia jeszcze lepszy wgląd w szczegóły powierzchni, bardziej naturalne wyświetlanie powierzchni 3D, również bez zbytniego spadku wydajności. Ta technika jest podobna do mapowania przemieszczeń i mapowania normalnego w tym samym czasie, jest czymś pomiędzy. Metoda jest również zaprojektowana tak, aby wyświetlić więcej szczegółów powierzchni niż oryginalny model geometryczny. Jest to podobne do normalnego mapowania, ale różnica polega na tym, że metoda zniekształca mapowanie tekstury poprzez zmianę współrzędnych tekstury tak, że patrząc na powierzchnię pod różnymi kątami, wygląda ona na wypukłą, chociaż w rzeczywistości powierzchnia jest płaska i nie zmienia się . Innymi słowy, mapowanie paralaksy to technika przybliżania efektu przesunięcia punktów powierzchni w zależności od zmiany punktu widzenia.

Technika przesuwa współrzędne tekstury (stąd technika ta jest czasami nazywana mapowaniem offsetowym), dzięki czemu powierzchnia wygląda na bardziej obszerną. Ideą tej metody jest zwrócenie współrzędnych tekstury punktu, w którym wektor widoku przecina powierzchnię. Wymaga to ray tracingu (ray tracingu) dla mapy wysokości, ale jeśli nie ma zbyt wielu zmieniających się wartości („gładki” lub „gładki”), można zrezygnować z przybliżania. Ta metoda jest dobra dla powierzchni o płynnie zmieniających się wysokościach, bez błędnego obliczania przecięć i dużych wartości odsunięcia. Taki prosty algorytm różni się od normalnego mapowania tylko trzema instrukcjami shadera pikseli: dwiema instrukcjami matematycznymi i jednym dodatkowym pobieraniem z tekstury. Po obliczeniu nowej współrzędnej tekstury jest ona używana do dalszego odczytu innych warstw tekstury: tekstury bazowej, mapy normalnej itp. Ta metoda mapowania paralaksy na nowoczesnych chipach wideo jest prawie tak samo skuteczna, jak konwencjonalne mapowanie tekstur, a jej wynikiem jest bardziej realistyczne wyświetlanie powierzchni niż proste mapowanie normalne.

Ale użycie konwencjonalnego mapowania paralaksy jest ograniczone do map wysokości z niewielką różnicą wartości. Nieprawidłowości „strome” są przetwarzane przez algorytm niepoprawnie, pojawiają się różne artefakty, tekstury „unoszą się” itp. Opracowano kilka zmodyfikowanych metod w celu ulepszenia techniki mapowania paralaksy. Kilku badaczy (Yerex, Donnelly, Tatarchuk, Policarpo) opisało nowe metody poprawiające początkowy algorytm. Prawie wszystkie pomysły opierają się na ray tracingu w pixel shaderze w celu określenia wzajemnego przecinania się szczegółów powierzchni. Zmodyfikowane techniki otrzymały kilka różnych nazw: mapowanie paralaksy z okluzją, mapowanie paralaksy z funkcjami odległości, mapowanie paralaksy okluzji. Dla zwięzłości będziemy je nazywać mapowaniem okluzji paralaksy.

Metody mapowania paralaksy okluzji obejmują również śledzenie promieni w celu określenia wysokości i uwzględnienia widoczności tekseli. Rzeczywiście, patrząc pod kątem do powierzchni, teksele blokują się nawzajem, a mając to na uwadze, można dodać więcej głębi do efektu paralaksy. Wynikowy obraz staje się bardziej realistyczny i takie ulepszone metody można wykorzystać do uzyskania głębszego reliefu, doskonale nadaje się do przedstawiania ceglanych i kamiennych ścian, chodników itp. Należy szczególnie zauważyć, że główną różnicą między mapowaniem paralaksy a mapowaniem przemieszczenia jest to, że obliczenia wszystkie są na piksel, a nie powierzchowne. Dlatego metoda ma nazwy takie jak Virtual Displacement Mapping i Per-Pixel Displacement Mapping. Spójrz na zdjęcie, trudno w to uwierzyć, ale kamienie chodnika to tylko efekt piksel po pikselu:

Metoda pozwala na efektywne wyświetlanie szczegółowych powierzchni bez milionów wierzchołków i trójkątów, które byłyby wymagane przy implementacji tej geometrii. Jednocześnie zachowana jest wysoka szczegółowość (z wyjątkiem sylwetek/krawędzi), a obliczenia animacji są znacznie uproszczone. Ta technika jest tańsza niż użycie rzeczywistej geometrii i używa się znacznie mniej wielokątów, zwłaszcza w przypadku bardzo małych detali. Algorytm ma wiele zastosowań i najlepiej nadaje się do kamieni, cegieł i tym podobnych.

Dodatkową zaletą jest to, że mapy wysokości mogą się dynamicznie zmieniać (powierzchnia wody z falami, dziury po kulach w ścianach i wiele innych). Wadą tej metody jest brak poprawnych geometrycznie sylwetek (krawędzi obiektu), ponieważ algorytm działa piksel po pikselu i nie jest rzeczywistym odwzorowaniem przemieszczeń. Ale oszczędza wydajność w postaci zmniejszenia obciążenia transformacji, oświetlenia i animacji geometrii. Zapisuje pamięć wideo wymaganą do przechowywania dużych ilości danych geometrycznych. Technologia korzysta również ze stosunkowo prostej integracji z istniejącymi aplikacjami i użycia znanych narzędzi używanych do normalnego mapowania w procesie.

Ta technika jest już używana w prawdziwe gry ostatni raz. Jak dotąd radzą sobie z prostym mapowaniem paralaksy opartym na statycznych mapach wysokości, bez śledzenia promieni i obliczania przecięć. Oto kilka przykładów wykorzystania mapowania paralaksy w grach:

Przetwarzanie końcowe

W szerokim sensie przetwarzanie końcowe to wszystko, co dzieje się po głównych etapach obrazowania. Innymi słowy, przetwarzanie końcowe to każda zmiana w obrazie po jego wyrenderowaniu. Post-processing to zestaw narzędzi do tworzenia specjalnych efektów wizualnych, a ich tworzenie odbywa się po zakończeniu głównej pracy nad renderowaniem sceny, czyli przy tworzeniu efektów post-processingu wykorzystywany jest gotowy obraz rastrowy.

Prosty przykład ze zdjęcia: sfotografowałeś piękne jezioro z zielenią przy dobrej pogodzie. Niebo jest bardzo jasne, a drzewa zbyt ciemne. Wczytujesz zdjęcie do edytora graficznego i zaczynasz zmieniać jasność, kontrast i inne parametry dla obszarów obrazu lub dla całego obrazu. Ale nie masz już możliwości zmiany ustawień aparatu, wykonujesz obróbkę gotowego obrazu. To jest przetwarzanie końcowe. Lub inny przykład: wybranie tła w fotografii portretowej i zastosowanie filtra rozmycia do tego obszaru, aby uzyskać efekt głębi ostrości o większej głębi. Oznacza to, że kiedy zmieniasz lub poprawiasz klatkę w edytorze graficznym, wykonujesz przetwarzanie końcowe. To samo można zrobić w grze, w czasie rzeczywistym.

Istnieje wiele różnych możliwości przetwarzania obrazu po renderowaniu. Każdy prawdopodobnie widział wiele tak zwanych filtrów graficznych w edytorach graficznych. To jest dokładnie to, co nazywa się filtrami końcowymi: rozmycie, wykrywanie krawędzi, wyostrzanie, szum, gładkość, wypukłość itp. W przypadku renderowania 3D w czasie rzeczywistym odbywa się to w ten sposób – cała scena jest renderowana w specjalnym obszarze, renderowanym docelowy, a po głównym renderowaniu obraz ten jest dodatkowo przetwarzany za pomocą pixel shaderów i dopiero potem wyświetlany na ekranie. Spośród efektów post-processingu w grach najczęściej używane są:. Istnieje wiele innych post-efektów: szumy, flary, dystorsja, sepia itp.

Oto para uderzające przykłady przetwarzanie końcowe w aplikacjach do gier:

Wysoki zakres dynamiki (HDR)

High Dynamic Range (HDR) w zastosowaniu do grafiki 3D to renderowanie z wysokim zakresem dynamiki. Istotą HDR jest opisywanie intensywności i koloru za pomocą rzeczywistych wielkości fizycznych. Zwykłym modelem opisu obrazu jest RGB, gdzie wszystkie kolory są reprezentowane jako suma kolorów podstawowych: czerwonego, zielonego i niebieskiego, o różnej intensywności w postaci możliwych wartości całkowitych od 0 do 255 dla każdego, zakodowanych za pomocą osiem bitów na kolor. Stosunek maksymalnej intensywności do minimum, jakie może wyświetlić konkretny model lub urządzenie, nazywa się zakresem dynamicznym. Tak więc zakres dynamiczny modelu RGB wynosi 256:1 lub 100:1 cd/m2 (dwa rzędy wielkości). Ten model opisu koloru i intensywności jest powszechnie określany jako Low Dynamic Range (LDR).

Możliwe wartości LDR dla wszystkich przypadków są zdecydowanie niewystarczające, człowiek jest w stanie dostrzec znacznie większy zasięg, zwłaszcza przy niskim natężeniu światła, a model RGB jest w takich przypadkach zbyt ograniczony (i przy wysokich natężeniach też). Zakres dynamiczny ludzkiego widzenia wynosi od 10 -6 do 108 cd / m2, czyli 10 000 000 000 000: 1 (14 rzędów wielkości). Nie możemy zobaczyć całego zasięgu jednocześnie, ale zasięg widoczny dla oka w danym momencie wynosi około 10 000:1 (cztery rzędy wielkości). Wzrok stopniowo przystosowuje się do wartości z innej części zakresu oświetlenia, wykorzystując tzw. adaptację, którą łatwo można opisać sytuacją z wyłączaniem światła w pomieszczeniu w nocy – początkowo oczy widzą bardzo mało, ale z czasem dostosowują się do zmieniających się warunków oświetleniowych i widzą znacznie więcej... To samo dzieje się, gdy zmieniasz ciemne otoczenie z powrotem na jasne.

Tak więc zakres dynamiczny modelu opisu RGB nie wystarcza do przedstawienia obrazów, które dana osoba jest w stanie zobaczyć w rzeczywistości, model ten znacznie zmniejsza możliwe wartości natężenia światła w górnej i dolnej części zakresu. Najczęstszym przykładem przytaczanym w materiale HDR jest obraz zaciemnionego pokoju z oknem na jasną ulicę w słoneczny dzień. Dzięki modelowi RGB możesz uzyskać normalne wyświetlanie tego, co jest za oknem, lub tylko tego, co znajduje się w pomieszczeniu. Wartości powyżej 100 cd/m2 w LDR są na ogół przycinane, dlatego w renderowaniu 3D trudno jest renderować jasne źródła światła bezpośrednio do kamery.

Do tej pory samych urządzeń wyświetlających dane nie można poważnie ulepszyć i warto zrezygnować z LDR w obliczeniach, można użyć rzeczywistych fizycznych wartości intensywności i koloru (lub liniowo proporcjonalnych) i wyświetlić maksimum, na którym może monitor. Istotą reprezentacji HDR jest używanie wartości intensywności i kolorów w rzeczywistych wielkościach fizycznych lub liniowo proporcjonalnych oraz używanie nie liczb całkowitych, ale liczb zmiennoprzecinkowych z dużą precyzją (na przykład 16 lub 32 bity). Usuwa to ograniczenia modelu RGB i radykalnie zwiększa zakres dynamiczny obrazu. Ale wtedy dowolny obraz HDR może być wyświetlany na dowolnym nośniku wyświetlania (ten sam monitor RGB), z najwyższą możliwą jakością przy użyciu specjalnych algorytmów.

Renderowanie HDR umożliwia zmianę ekspozycji po wyrenderowaniu obrazu. Umożliwia symulację efektu adaptacji ludzkiego wzroku (przechodzenie z jasnych otwartych przestrzeni do ciemnych pomieszczeń i odwrotnie), pozwala na fizycznie poprawne oświetlenie, a także jest zunifikowanym rozwiązaniem do zastosowania efektów post-processingu (odblaski, flary, rozmycie, rozmycie ruchu). Algorytmy przetwarzania obrazu, korekcja kolorów, korekcja gamma, rozmycie ruchu, bloom i inne metody przetwarzania końcowego są lepiej wykonywane w reprezentacji HDR.

W aplikacjach do renderowania 3D w czasie rzeczywistym (głównie w grach) nie tak dawno zaczęto stosować renderowanie HDR, ponieważ wymaga obliczeń i obsługi celu renderowania w formatach zmiennoprzecinkowych, które najpierw stały się dostępne tylko w układach wideo z obsługą DirectX 9. Zwykła ścieżka renderowania HDR w grach: renderowanie sceny do bufora zmiennoprzecinkowego, przetwarzanie końcowe obrazu w rozszerzonym zakresie kolorów (zmiana kontrastu i jasności, balans kolorów, odblaski i efekty rozmycia ruchu, flary obiektywu i na przykład), zastosowanie mapowania tonów w celu wyprowadzenia końcowego obrazu HDR na urządzenie wyświetlające LDR. Czasami mapy otoczenia są używane w formatach HDR, do statycznych odbić na obiektach, bardzo interesujące jest wykorzystanie HDR w symulowaniu dynamicznych załamań i odbić, do tego można również wykorzystać mapy dynamiczne w formatach zmiennoprzecinkowych. Do tego można dodać więcej map świetlnych, obliczonych z góry i zapisanych w formacie HDR. Wiele z powyższych zostało zrobione na przykład w Half-Life 2: Lost Coast.

Renderowanie HDR jest bardzo przydatne w przypadku złożonego przetwarzania końcowego o wyższej jakości niż metody konwencjonalne. Ten sam efekt poświaty będzie wyglądał bardziej realistycznie, gdy zostanie obliczony w modelu widoku HDR. Na przykład, tak jak ma to miejsce w grze Far Cry firmy Crytek, wykorzystuje standardowe techniki renderowania HDR: stosuje filtry poświaty dostarczone przez Kawase i operatora mapowania tonów Reinharda.

Niestety, w niektórych przypadkach twórcy gier mogą ukryć pod nazwą HDR tylko filtr bloom, obliczony w zwykłym zakresie LDR. I chociaż większość tego, co dzieje się teraz w grach z renderowaniem HDR, to właśnie tym jest bloom. najwyższa jakość Korzyści płynące z renderowania HDR nie ograniczają się tylko do tego post-efektu, jest to po prostu najłatwiejsze do zrobienia.

Inne przykłady renderowania HDR w aplikacjach czasu rzeczywistego:


Mapowanie tonalne to proces konwersji zakresu luminancji HDR na zakres LDR wyświetlany przez urządzenie wyjściowe, takie jak monitor lub drukarka, ponieważ przesyłanie do nich obrazów HDR będzie wymagało przekonwertowania zakresu dynamicznego i gamy modelu HDR na odpowiednią dynamikę LDR zakres, najczęściej RGB. W końcu zakres jasności prezentowany w HDR jest bardzo szeroki, to kilka rzędów wielkości bezwzględnego zakresu dynamicznego na raz, w jednej scenie. A zakres, który można odtworzyć na konwencjonalnych urządzeniach wyjściowych (monitory, telewizory) to tylko dwa rzędy wielkości zakresu dynamicznego.

Konwersja HDR do LDR nazywana jest mapowaniem tonów i jest stratna i naśladuje właściwości ludzkiego wzroku. Algorytmy te są powszechnie określane jako instrukcje mapowania tonów. Operatorzy dzielą wszystkie wartości jasności obrazu na trzy różne rodzaje: z ciemnym, średnim i jasnym światłem. Na podstawie oceny jasności półcieni koryguje się ogólne oświetlenie, wartości jasności pikseli sceny są redystrybuowane w celu wejścia w zakres wyjściowy, ciemne piksele są rozjaśniane, a jasne przyciemniane. Następnie najjaśniejsze piksele obrazu są skalowane do zakresu urządzenia wyjściowego lub modelu widoku wyjściowego. Poniższy rysunek przedstawia najprostszą konwersję obrazu HDR do zakresu LDR, transformacja liniowa, a do fragmentu w środku stosowany jest bardziej złożony operator mapowania tonów, który działa tak, jak opisano powyżej:

Widać, że tylko przy użyciu nieliniowego mapowania tonów można uzyskać maksimum detali na obrazie, a jeśli przekonwertuje się HDR do LDR liniowo, to wiele drobiazgów po prostu ginie. Nie ma jednego poprawnego algorytmu mapowania tonów, istnieje kilka operatorów, które dają dobre wyniki w różnych sytuacjach. Oto dobry przykład dwóch różnych instrukcji mapowania tonów:

Wraz z renderowaniem HDR ostatnio w grach zastosowano mapowanie tonów. Możliwe stało się opcjonalne symulowanie właściwości ludzkiego wzroku: utrata ostrości w ciemnych scenach, adaptacja do nowych warunków oświetleniowych podczas przejść z bardzo jasnych do ciemnych obszarów i odwrotnie, wrażliwość na zmiany kontrastu, koloru... wygląda imitacja zdolności widzenia do adaptacji w Far Cry. Pierwszy zrzut ekranu pokazuje obraz, który widzi gracz po przejściu z ciemnego pokoju do jasno oświetlonej otwartej przestrzeni, a drugi pokazuje ten sam obraz kilka sekund po adaptacji.

Kwiat

Bloom to jeden z kinowych efektów post-processingu, który rozjaśnia najjaśniejsze części obrazu. Jest to efekt bardzo jasnego światła, które objawia się w postaci poświaty wokół jasnych powierzchni, po zastosowaniu filtra bloom takie powierzchnie nie tylko uzyskują dodatkową jasność, światło z nich (halo) częściowo wpływa na ciemniejsze obszary przyległe do jasnych powierzchni w ramie. Najłatwiej to pokazać na przykładzie:

W grafice 3D Bloom filtr wykonywany jest z wykorzystaniem dodatkowej obróbki końcowej - mieszania klatki rozmytej przez filtr rozmycia (cała klatka lub jej poszczególne jasne obszary, filtr jest zwykle nakładany kilka razy) oraz klatki oryginalnej. Jeden z najczęściej używanych algorytmów bloom po filtrze w grach i innych aplikacjach czasu rzeczywistego:

  • Scena jest renderowana do bufora ramki, intensywność poświaty obiektów jest zapisywana w kanale alfa bufora.
  • Bufor ramki jest kopiowany do specjalnej tekstury w celu przetworzenia.
  • Rozdzielczość tekstur jest zmniejszona na przykład czterokrotnie.
  • Filtry antyaliasingowe (rozmycie) są nakładane na obraz kilkakrotnie w oparciu o dane o intensywności zarejestrowane w kanale alfa.
  • Wynikowy obraz jest mieszany z oryginalną klatką w buforze ramki, a wynik jest wyświetlany na ekranie.

Podobnie jak inne rodzaje przetwarzania końcowego, bloom najlepiej nadaje się do renderowania w wysokim zakresie dynamicznym (HDR). Dodatkowe przykłady przetwarzania końcowego obrazu przez filtr bloom z aplikacji 3D w czasie rzeczywistym:

Rozmycie w ruchu

Rozmycie ruchu pojawia się na zdjęciach i filmach z powodu ruchu obiektów w kadrze podczas czasu naświetlania kadru, gdy przesłona obiektywu jest otwarta. Kadr zrobiony aparatem (zdjęcie, film) nie pokazuje zdjęcia zrobionego natychmiast z zerowym czasem trwania. Ze względu na ograniczenia technologiczne kadr pokazuje pewien okres czasu, w tym czasie obiekty w kadrze mogą przemieścić się na określoną odległość, a jeśli tak się stanie, to wszystkie pozycje poruszającego się obiektu podczas otwartej przesłony obiektywu zostaną przedstawiony na ramie jako rozmyty obraz wzdłuż wektora ruchu ... Dzieje się tak, gdy obiekt porusza się względem kamery lub kamera jest względem obiektu, a ilość rozmycia daje nam wyobrażenie o wielkości prędkości obiektu.

W trójwymiarowej animacji, w dowolnym momencie czasu (klatce), obiekty znajdują się w określonych współrzędnych w trójwymiarowej przestrzeni, podobnie jak wirtualna kamera o nieskończenie krótkim czasie otwarcia migawki. W efekcie nie ma rozmycia podobnego do tego, jakie uzyskuje aparat i ludzkie oko podczas patrzenia na szybko poruszające się obiekty. Wygląda nienaturalnie i nierealistycznie. Rozważ prosty przykład: kilka sfer obraca się wokół jakiejś osi. Oto obraz przedstawiający ten ruch z rozmyciem i bez niego:

Z obrazu bez rozmycia nie można nawet stwierdzić, czy kule się poruszają, czy nie, a rozmycie ruchu daje jasny obraz prędkości i kierunku ruchu obiektów. Nawiasem mówiąc, brak rozmycia ruchu jest również powodem, dla którego ruch w grach z szybkością 25-30 klatek na sekundę wydaje się niestabilny, chociaż filmy i filmy wyglądają świetnie przy tych samych parametrach liczby klatek na sekundę. Aby zrekompensować brak rozmycia w ruchu, pożądana jest wysoka liczba klatek na sekundę (60 klatek na sekundę lub więcej) lub zastosowanie dodatkowych metod przetwarzania obrazu w celu emulacji efektu rozmycia w ruchu. Służy to poprawie płynności animacji i jednocześnie uzyskania efektu fotograficznego i kinowego realizmu.

Najprostszym algorytmem rozmycia ruchu dla aplikacji działających w czasie rzeczywistym jest wykorzystanie danych z poprzednich klatek animacji do renderowania bieżącej klatki. Ale są też bardziej wydajne i nowoczesne metody rozmycia ruchu, które nie wykorzystują poprzednich klatek, ale opierają się na wektorach ruchu obiektów w klatce, dodając tylko jeden krok przetwarzania końcowego do procesu renderowania. Efekt rozmycia może być wyświetlany w trybie pełnoekranowym (zwykle w post-processingu) lub w przypadku pojedynczych, najszybciej poruszających się obiektów.

Możliwe zastosowania efektu rozmycia ruchu w grach: wszystkie gry wyścigowe (do tworzenia efektu bardzo dużej prędkości ruchu oraz do wykorzystania podczas oglądania powtórek podobnych do telewizji), gry sportowe (te same powtórki oraz w samej grze, rozmycie może stosować do bardzo szybko poruszających się obiektów, takich jak piłka czy krążek), gier walki (szybkie ruchy broni białej, rąk i nóg), wielu innych gier (podczas gry trójwymiarowych przerywników filmowych na silniku). Oto kilka przykładów efektów rozmycia ruchu w grach:

Głębia ostrości (DOF)

Krótko mówiąc, głębia ostrości to rozmycie obiektów w zależności od ich położenia względem ostrości aparatu. W prawdziwym życiu, na fotografiach i w filmach, nie wszystkie obiekty widzimy jednakowo wyraźnie, wynika to ze specyfiki budowy oka oraz budowy optyki aparatów fotograficznych i kamer kinowych. Optyka fotograficzna i kinematograficzna ma pewną odległość, obiekty znajdujące się w takiej odległości od aparatu są ostre i na zdjęciu wyglądają ostro, a obiekty dalej lub blisko aparatu wręcz przeciwnie, wyglądają na rozmyte, ostrość maleje stopniowo z rosnącą lub malejącą odległością ...

Jak się domyślasz, to jest fotografia, a nie renderowanie. W grafice komputerowej każdy obiekt renderowanego obrazu jest doskonale wyraźny, ponieważ w obliczeniach nie imituje się soczewek i optyki. Dlatego, aby osiągnąć realizm zdjęć i filmów, trzeba użyć specjalnych algorytmów, które zrobią coś podobnego dla grafiki komputerowej. Techniki te symulują efekt innego skupienia na obiektach w różnych odległościach.

Jedną z typowych technik renderowania w czasie rzeczywistym jest mieszanie oryginalnej klatki i jej rozmytej wersji (wielokrotne przejścia filtra rozmycia) w oparciu o dane dotyczące głębi pikseli na obrazie. W grach istnieje kilka zastosowań efektu DOF, na przykład wideo z gry w silniku gry, powtórki w grach sportowych i wyścigowych. Przykłady głębi ostrości w czasie rzeczywistym:

Poziom szczegółowości (LOD)

Poziom szczegółowości w aplikacjach 3D to metoda zmniejszania złożoności renderowania klatki, zmniejszania całkowitej liczby wielokątów, tekstur i innych zasobów w scenie oraz ogólnie zmniejszania jej złożoności. Prosty przykład: główny model postaci składa się z 10 000 wielokątów. W przypadkach, gdy znajduje się blisko kamery w przetwarzanej scenie, ważne jest, aby zostały użyte wszystkie wielokąty, ale w bardzo dużej odległości od kamery w końcowym obrazie zajmie tylko kilka pikseli, a nie ma punktu przetwarzania wszystkich 10 000 wielokątów. Być może w tym przypadku setki wielokątów, a nawet kilka wielokątów i specjalnie przygotowana tekstura wystarczą do mniej więcej takiego samego wyświetlenia modelu. W związku z tym na średnich odległościach sensowne jest użycie modelu składającego się z większej liczby trójkątów niż model najprostszy i mniej niż najbardziej złożony.

Metoda LOD jest zwykle używana podczas modelowania i renderowania scen 3D, przy użyciu kilku poziomów złożoności (geometrycznej lub innej) dla obiektów, proporcjonalnie do odległości między nimi a kamerą. Technika ta jest często wykorzystywana przez twórców gier w celu zmniejszenia liczby wielokątów w scenie i poprawienia wydajności. W przypadku umieszczenia w pobliżu kamery modele o maksymalnej szczegółowości (liczba trójkątów, rozmiar tekstury, złożoność teksturowania) są używane, aby uzyskać najwyższą możliwą jakość obrazu i odwrotnie, gdy modele są usuwane z kamery, modele z mniej trójkątów jest używanych do zwiększenia szybkości renderowania. Zmiana złożoności, w szczególności liczby trójkątów w modelu, może następować automatycznie w oparciu o jeden model 3D o maksymalnej złożoności lub może w oparciu o kilka wcześniej przygotowanych modeli o różnych poziomach szczegółowości. Dzięki zastosowaniu modeli o mniejszej liczbie szczegółów dla różnych odległości szacowana złożoność renderowania jest zmniejszona, prawie bez pogorszenia ogólnej szczegółowości obrazu.

Metoda jest szczególnie skuteczna, gdy liczba obiektów w scenie jest duża i znajdują się one na różne odległości z aparatu. Weźmy na przykład grę sportową, taką jak symulator hokeja lub piłki nożnej. Modele postaci Low poly są używane, gdy znajdują się daleko od kamery, a po zbliżeniu modele są zastępowane innymi z dużą liczbą wielokątów. Ten przykład jest bardzo prosty i pokazuje istotę metody opartej na dwóch poziomach szczegółowości modelu, ale nikt nie zadaje sobie trudu tworzenia kilku poziomów szczegółowości, aby efekt zmiany poziomu LOD nie był zbyt zauważalny, aby szczegóły stopniowo "rosnąć" w miarę zbliżania się obiektu.

Oprócz odległości od kamery znaczenie dla LOD mogą mieć również inne czynniki - całkowita liczba obiektów na ekranie (gdy w kadrze znajduje się jeden lub dwa znaki, wówczas stosowane są modele złożone, a przy 10-20, przełącz na prostsze) lub liczbę klatek na sekundę (ustawiane są limity wartości FPS, przy których zmienia się poziom szczegółowości np. przy FPS poniżej 30 zmniejszamy złożoność modeli na ekranie, a w wieku 60 lat wręcz przeciwnie). Inne możliwe czynniki wpływające na poziom szczegółowości to prędkość ruchu obiektu (nie będziesz miał czasu na rozważenie rakiety w ruchu, ale z łatwością zobaczysz ślimaka), znaczenie postaci z punktu widzenia gry ( weź tę samą piłkę - dla modelu zawodnika, którym sterujesz, możesz użyć bardziej złożonej geometrii i tekstur, widzisz to najbliżej i najczęściej). Wszystko zależy od pragnień i możliwości konkretnego programisty. Najważniejsze, żeby nie przesadzać, denerwują częste i zauważalne zmiany w poziomie szczegółowości.

Przypomnę, że poziom szczegółowości niekoniecznie odnosi się tylko do geometrii, metoda może być również wykorzystana do zaoszczędzenia innych zasobów: podczas teksturowania (chociaż chipy wideo już używają mipmappingu, czasami ma sens zmiana tekstur w locie na inne z różnymi szczegółami), techniki oświetleniowe (bliskie obiekty są oświetlane za pomocą złożonego algorytmu, a odległe - za pomocą prostego), technikę teksturowania (złożone mapowanie paralaksy jest używane na bliskich powierzchniach, a normalne mapowanie jest używane na dalekich) itp. .

Nie jest łatwo pokazać przykład z gry, z jednej strony do pewnego stopnia LOD jest używany prawie w każdej grze, z drugiej strony nie zawsze da się to wyraźnie pokazać, inaczej nie byłoby sensu w samym LOD.

Ale w tym przykładzie nadal jest jasne, że najbliższy model samochodu ma maksymalną szczegółowość, następne dwa lub trzy samochody są również bardzo zbliżone do tego poziomu, a wszystkie odległe mają widoczne uproszczenia, tutaj są tylko najbardziej znaczące: są brak lusterek wstecznych, tablic rejestracyjnych, wycieraczek itp. dodatkowe wyposażenie oświetleniowe. A z najdalszego modelu na drodze nie ma nawet cienia. To jest algorytm poziomu szczegółowości w działaniu.

Globalne oświetlenie

Trudno jest symulować realistyczne oświetlenie sceny, każdy promień światła w rzeczywistości jest wielokrotnie odbijany i załamywany, liczba tych odbić nie jest ograniczona. A w renderowaniu 3D liczba odbić silnie zależy od możliwości projektowych, każde obliczenie sceny jest uproszczonym modelem fizycznym, a wynikowy obraz jest tylko zbliżony do realizmu.

Algorytmy oświetlenia można podzielić na dwa modele: oświetlenie bezpośrednie lub lokalne oraz oświetlenie globalne (oświetlenie bezpośrednie lub lokalne i oświetlenie globalne). Model oświetlenia lokalnego wykorzystuje obliczenia oświetlenia bezpośredniego, światło ze źródeł światła do pierwszego przecięcia światła z nieprzezroczystą powierzchnią, nie jest brane pod uwagę wzajemne oddziaływanie obiektów. Choć taki model stara się to skompensować dodając oświetlenie tła lub jednolite (otoczenia), jest to najprostsze przybliżenie, mocno uproszczone oświetlenie od wszystkich pośrednich promieni źródeł światła, które określa kolor i intensywność oświetlenia obiektów przy braku bezpośrednich źródeł światła.

Ten sam ray tracing oblicza oświetlenie powierzchni tylko przez bezpośrednie promienie ze źródeł światła i każda powierzchnia, aby była widoczna, musi być bezpośrednio oświetlona przez źródło światła. To za mało, aby uzyskać fotorealistyczne rezultaty, oprócz oświetlenia bezpośredniego należy uwzględnić oświetlenie wtórne promieniami odbitymi od innych powierzchni. W prawdziwym świecie promienie światła odbijają się od powierzchni kilka razy, aż do całkowitego wygaszenia. Światło słoneczne przechodzące przez okno oświetla całe pomieszczenie, chociaż promienie nie mogą bezpośrednio dotrzeć do wszystkich powierzchni. Im jaśniejsze źródło światła, tym więcej razy zostanie odbite. Na kolor odbijanego światła wpływa również kolor powierzchni odbijającej, na przykład czerwona ściana spowoduje pojawienie się czerwonej plamy na sąsiednim białym obiekcie. Oto wyraźna różnica, obliczenia bez i z uwzględnieniem oświetlenia wtórnego:

W modelu globalnego oświetlenia oświetlenie globalne obliczane jest z uwzględnieniem wpływu obiektów na siebie nawzajem, uwzględniane są wielokrotne odbicia i załamania promieni świetlnych od powierzchni obiektów, kaustyka i rozproszenie podpowierzchniowe. Ten model pozwala uzyskać bardziej realistyczny obraz, ale komplikuje proces, wymagając znacznie więcej zasobów. Istnieje kilka algorytmów globalnego oświetlenia, przyjrzymy się krótko radiosity (obliczanie oświetlenia pośredniego) i mapowaniu fotonów (obliczanie oświetlenia globalnego na podstawie map fotonów wstępnie obliczonych za pomocą śledzenia). Istnieją również uproszczone metody symulowania oświetlenia pośredniego, takie jak zmiana ogólnej jasności sceny w zależności od liczby i jasności znajdujących się w niej źródeł światła lub użycie dużej liczby świateł punktowych umieszczonych wokół sceny w celu symulowania światła odbitego, ale nadal jest to dalekie od prawdziwego algorytmu.GI.

Algorytm radiosity to proces obliczania wtórnych odbić promieni świetlnych z jednej powierzchni na drugą, a także z otoczenia do obiektów. Promienie ze źródeł światła są śledzone, aż ich siła spadnie poniżej określonego poziomu lub promienie osiągną określoną liczbę odbić. Jest to powszechna technika GI, obliczenia są zwykle wykonywane przed renderowaniem, a wyniki obliczeń można wykorzystać do renderowania w czasie rzeczywistym. Podstawowe idee radiosity opierają się na fizyce wymiany ciepła. Powierzchnie obiektów podzielone są na małe obszary zwane plamami i zakłada się, że odbite światło jest rozproszone równomiernie we wszystkich kierunkach. Zamiast obliczać każdą wiązkę dla świateł, stosuje się technikę uśredniania, dzieląc światła na plamy w oparciu o poziomy energii, które wytwarzają. Energia ta jest rozprowadzana proporcjonalnie pomiędzy płatami powierzchni.

Inną metodą obliczania oświetlenia globalnego, zaproponowaną przez Henrika Wanna Jensena, jest metoda mapowania fotonów. Mapowanie fotoniczne to kolejny algorytm globalnego oświetlenia wykorzystujący śledzenie promieni, używany do symulowania interakcji promieni świetlnych z obiektami na scenie. Algorytm oblicza wtórne odbicia promieni, załamanie światła przez powierzchnie przezroczyste, odbicia rozproszone. Metoda ta polega na obliczeniu oświetlenia punktów na powierzchni w dwóch przejściach. Pierwszym z nich jest bezpośrednie śledzenie promieni świetlnych z odbiciami wtórnymi, jest to proces wstępny wykonywany przed renderowaniem głównym. Ta metoda oblicza energię fotonów przechodzących ze źródła światła do obiektów na scenie. Kiedy fotony dotrą do powierzchni, punkt przecięcia, kierunek i energia fotonu są przechowywane w pamięci podręcznej zwanej mapą fotonów. Mapy fotoniczne można zapisać na dysku do późniejszego wykorzystania, dzięki czemu nie trzeba ich renderować w każdej klatce. Odbicia fotonów są obliczane do momentu zakończenia pracy po określonej liczbie odbić lub po osiągnięciu określonej energii. W drugim przejściu renderowania obliczane jest oświetlenie pikseli sceny promieniami bezpośrednimi, biorąc pod uwagę dane zapisane na mapach fotonów, energia fotonów jest dodawana do energii oświetlenia bezpośredniego.

Obliczenia globalnego oświetlenia, które wykorzystują dużą liczbę odbić wtórnych, trwają znacznie dłużej niż obliczenia oświetlenia bezpośredniego. Istnieją techniki sprzętowego obliczania miasta radiowego w czasie rzeczywistym, które wykorzystują możliwości najnowszych generacji programowalnych chipów wideo, ale na razie sceny, dla których obliczane jest globalne oświetlenie w czasie rzeczywistym, powinny być dość proste i mają wiele uproszczeń. wykonane w algorytmach.

Ale to, co jest używane od dawna, to statyczne, wstępnie obliczone globalne oświetlenie, które jest akceptowalne dla scen bez zmiany położenia źródeł światła i dużych obiektów, które silnie wpływają na oświetlenie. W końcu obliczenie oświetlenia globalnego nie zależy od pozycji obserwatora, a jeśli położenie takich obiektów w scenie i parametry źródeł oświetlenia nie zmieniają się w scenie, to obliczone wcześniej wartości oświetlenia może być użyty. Jest to używane w wielu grach, przechowując dane obliczeniowe GI w postaci lightmap.

Istnieją również akceptowalne algorytmy symulacji dynamicznego oświetlenia globalnego. Na przykład, istnieje taka prosta metoda do wykorzystania w aplikacjach czasu rzeczywistego do obliczania pośredniego oświetlenia obiektu w scenie: uproszczone renderowanie wszystkich obiektów o zmniejszonej szczegółowości (z wyjątkiem tego, dla którego obliczane jest oświetlenie) w mapa sześcianowa niskiej rozdzielczości (może być również używana do wyświetlania dynamicznych odbić na powierzchni obiektu), następnie filtrowanie tej tekstury (kilka przejść filtru rozmycia) i zastosowanie danych z obliczonej tekstury do oświetlenia tego obiektu jako uzupełnienie oświetlenia bezpośredniego. W przypadkach, gdy obliczenia dynamiczne są zbyt ciężkie, można sobie poradzić ze statycznymi mapami radiosity. Przykład z gry MotoGP 2, który wyraźnie pokazuje dobroczynny wpływ nawet tak prostej imitacji GI:



Zaprojektowany do wykonywania przez procesory kart graficznych (GPU). Shadery są kompilowane w jednym ze specjalistycznych języków programowania (patrz) i kompilowane w instrukcje dla GPU.

Podanie

Przed zastosowaniem shaderów stosowano proceduralne generowanie tekstur (używane na przykład w grze Unreal do tworzenia animowanych tekstur wody i ognia) oraz multiteksturowanie (na którym opierał się język shaderów używany w grze Quake 3). Mechanizmy te nie zapewniały takiej elastyczności jak shadery.

Wraz z pojawieniem się rekonfigurowalnych potoków graficznych stało się możliwe wykonywanie obliczeń matematycznych (GPGPU) na GPU. Najbardziej znanymi mechanizmami GPGPU są nVidia CUDA, Microsoft DirectCompute i open source OpenCL.

Rodzaje shaderów

Moduły cieniujące wierzchołki

Vertex Shader operuje na danych powiązanych z wierzchołkami wielościanów, na przykład ze współrzędnymi wierzchołka (punktu) w przestrzeni, ze współrzędnymi tekstury, z kolorem wierzchołka, z wektorem stycznym, z wektorem binormalnym, z normalnym wektor. Vertex Shader może być używany do przeglądania i przekształcania perspektywicznego wierzchołków, generowania współrzędnych tekstury, obliczania oświetlenia itp.

Przykładowy kod dla Vertex Shader w języku:

vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0, v3

Geometryczne shadery

Geometryczny shader, w przeciwieństwie do Vertex Shadera, może przetwarzać nie tylko jeden wierzchołek, ale także cały prymityw. Prymityw może być segmentem (dwa wierzchołki) i trójkątem (trzy wierzchołki), a jeśli istnieją informacje o sąsiednich wierzchołkach (przyleganie angielskie) dla trójkąta podstawowego, można przetworzyć do sześciu wierzchołków. Geometry Shader jest zdolny do generowania prymitywów w locie (bez użycia centralnego procesora).

Geometry Shadery zostały po raz pierwszy użyte na kartach graficznych z serii Nvidia 8.

Shadery pikseli (fragmentów)

Pixel Shader współpracuje z plasterkami bitmapowymi i teksturami - przetwarza dane związane z pikselami (na przykład kolor, głębię, współrzędne tekstury). Pixel Shader jest używany na ostatnim etapie potoku graficznego do utworzenia fragmentu obrazu.

Przykładowy kod dla Pixel Shadera w języku:

ps.1.4 texld r0, t0 mul r0, r0, v0

Zalety i wady

Zalety:

  • umiejętność komponowania dowolnych algorytmów (elastyczność, uproszczenie i obniżenie kosztów cyklu tworzenia programu, zwiększenie złożoności i realizmu renderowanych scen);
  • zwiększona szybkość wykonania (w porównaniu do szybkości wykonania tego samego algorytmu wykonywanego na procesorze centralnym).

Niedogodności:

  • potrzeba nauki nowego języka programowania;
  • istnienie różnych zestawów instrukcji dla procesorów graficznych różnych producentów.

Języki programowania

Stworzono wiele języków programowania shaderów, aby sprostać różnym potrzebom rynku (grafika komputerowa ma wiele obszarów zastosowań).

Zazwyczaj języki do pisania shaderów zapewniają programiście specjalne typy danych (macierze, samplery, wektory itp.), zestaw wbudowanych zmiennych i stałych (do interakcji ze standardową funkcjonalnością API 3D).

Profesjonalne renderowanie

Poniżej przedstawiono języki programowania shaderów, które koncentrują się na osiągnięciu maksymalnej jakości renderowania. W takich językach właściwości materiałów są opisywane za pomocą abstrakcji. Pozwala to na pisanie kodu osobom, które nie mają specjalnych umiejętności programistycznych i nie znają specyfiki implementacji sprzętowych. Na przykład artyści mogą napisać te shadery, aby zapewnić „właściwy wygląd” (mapowanie tekstur, rozmieszczenie światła itp.).

Zazwyczaj przetwarzanie takich shaderów jest dość zasobożerne: tworzenie fotorealistycznych obrazów wymaga dużych moc obliczeniowa... Zazwyczaj większość obliczeń jest wykonywana przez duże klastry komputerowe lub systemy kasetowe.

RenderMan Język programowania shaderów, zaimplementowany w oprogramowaniu RenderMan firmy Pixar, był pierwszym językiem programowania shaderów. Interfejs API RenderMan, opracowany przez Roba Cooka i opisany w specyfikacji interfejsu RenderMan, jest de facto standardem profesjonalnego renderowania, używanym w całej pracy firmy Pixar. OSL OSL - inż. Open Shading Language to język programowania shaderów opracowany przez Sony Pictures Imageworks i przypominający język. Wykorzystywany jest w autorskim programie „Arnold”, opracowanym przez „Sony Pictures Imageworks” i przeznaczonym do renderowania, oraz w darmowym programie Blender, przeznaczonym do tworzenia trójwymiarowej grafiki komputerowej. Renderowanie w czasie rzeczywistym GLSL GLSL otwarte GL S hading L język) to język programowania shaderów opisany w standardzie OpenGL i oparty na wersji języka opisanego w standardzie ANSI C. Język obsługuje większość funkcji ANSI C, obsługuje typy danych często używane podczas pracy z grafiką trójwymiarową (wektory, macierze). Słowo „shader” w GLSL odnosi się do niezależnie skompilowanej jednostki napisanej w tym języku. Słowo „program” odnosi się do zbioru skompilowanych shaderów połączonych ze sobą. Cg (pol. C dla g grafika) to język programowania shaderów opracowany przez firmę nVidia wraz z firmą Microsoft. Język jest podobny do języka i języka HLSL, opracowanego przez firmę Microsoft i zawartego w DirectX 9... Język używa typów „int”, „float”, „half” (liczba zmiennoprzecinkowa 16 bitów). Język obsługuje funkcje i struktury. Język ma osobliwe optymalizacje w postaci „spakowanych tablic” (

Wraz z globalną komputeryzacją do naszego świata napłynęła ogromna liczba niezrozumiałych terminów. Radzenie sobie z nimi wszystkimi nie jest tak łatwe, jak się wydaje na pierwszy rzut oka. Wiele z nich ma podobną nazwę, wiele ma szeroką funkcjonalność. Czas dowiedzieć się, czym jest shader, skąd pochodzi, do czego służy i do czego służy.

Optymalizator

Najprawdopodobniej jesteś zapalonym graczem Minecrafta i dlatego przyszedłeś dowiedzieć się, co to jest. Należy od razu zauważyć, że pojęcie „shader” jest łatwo oddzielone od tej gry i może „żyć” oddzielnie od niej. Podobnie jak mody. Dlatego nie warto ściśle łączyć tych dwóch pojęć.

Ogólnie rzecz biorąc, shader wywodzi się z programowania, pojawił się jako asystent specjalistów. Prawdopodobnie będzie głośno nazywać to narzędzie optymalizatorem, ale naprawdę poprawia to obraz w grach. Tak więc, kiedy już zacząłeś z grubsza rozumieć, co to jest, przejdźmy do dokładnej interpretacji.

Interpretacja

Co to jest shader? który jest wykonywany przez procesory kart graficznych. Narzędzia te są opracowywane w specjalnym języku. W zależności od celu może być inaczej. Następnie shadery są warunkowo tłumaczone na instrukcje dla procesorów akceleratorów graficznych.

Podanie

Należy od razu powiedzieć, że zastosowanie jako całość jest z góry określone przez cel. Programy są osadzone w procesorach kart graficznych, co oznacza, że ​​pracują na parametrach obiektów i obrazów grafiki trójwymiarowej. Mogą wykonywać różnorodne zadania, w tym pracować z odbiciem, załamaniem, ściemnianiem, efektami ścinania itp.

Przesłanka

Ludzie od dawna próbują dowiedzieć się, czym jest shader. Jeszcze przed tymi programami programiści robili wszystko ręcznie. Proces tworzenia obrazu z niektórych obiektów nie był zautomatyzowany. Zanim gra się narodziła, twórcy sami wykonali renderowanie. Pracowali z algorytmem, komponowali go do różnych zadań. Tak pojawiły się instrukcje dotyczące nakładania tekstur, efektów wideo itp.

Oczywiście niektóre procesy były nadal wbudowane w pracę kart graficznych. Takie algorytmy mogą być wykorzystywane przez programistów. Ale nie udało im się narzucić swoich algorytmów na kartę graficzną. Możliwość wykonania niestandardowych instrukcji jednostka centralna co było wolniejsze niż grafika.

Przykład

Aby zrozumieć różnicę, warto przyjrzeć się kilku przykładom. Oczywiście w grze renderowaniem może być sprzęt i oprogramowanie. Na przykład wszyscy pamiętamy słynnego Quake 2. Tak więc woda w grze może być po prostu niebieskim filtrem, jeśli chodzi o renderowanie sprzętowe. Ale dzięki interwencji programowej pojawił się plusk wody. Tak samo jest z CS 1.6. Renderowanie sprzętowe dawało tylko biały błysk, podczas gdy renderowanie programowe dodało pikselowany ekran.

Dostęp

Stało się więc jasne, że takie problemy trzeba rozwiązać. Akceleratory graficzne zaczęły rozszerzać liczbę algorytmów, które były popularne wśród programistów. Stało się jasne, że nie da się wszystkiego „wypchać”. Konieczne było otwarcie dostępu do specjalistów od kart graficznych.

Zanim pojawiły się gry takie jak „Minecraft” z modami i shaderami, programiści mieli możliwość pracy z blokami GPU w potokach, które mogły odpowiadać za różne instrukcje. W ten sposób stały się znane programy o nazwie „shader”. Aby je stworzyć, specjalnie opracowano języki programowania. Tak więc karty graficzne zaczęły być ładowane nie tylko standardową „geometrią”, ale także instrukcjami dla procesora.

Kiedy taki dostęp stał się możliwy, zaczęły się otwierać nowe możliwości programistyczne. Specjaliści mogli rozwiązywać problemy matematyczne na GPU. Obliczenia te stały się znane jako GPGPU. Ten proces wymagał specjalnych narzędzi. Z nVidia CUDA od Microsoft DirectCompute i framework OpenCL.

Rodzaje

Im więcej osób dowiedziało się, czym są shadery, tym więcej informacji o nich i ich możliwościach zostało ujawnionych. Początkowo akceleratory miały trzy procesory. Każdy był odpowiedzialny za swój własny rodzaj shadera. Z czasem zostały zastąpione uniwersalnym. Każdy z nich miał określony zestaw instrukcji, który miał jednocześnie trzy rodzaje shaderów. Mimo ujednolicenia dzieła do dziś zachował się opis każdego typu.

Typ Vertex działał z wierzchołkami kształtów, które mają wiele twarzy. W grę wchodzi wiele narzędzi. Na przykład mówimy o współrzędnych tekstury, wektorach stycznych, binormalnych lub normalnych.

Typ geometryczny działał nie tylko z jednym wierzchołkiem, ale także z całym prymitywem. Pixel został zaprojektowany do ogólnego przetwarzania fragmentów ilustracji bitmapowych i tekstur.

W grach

Jeśli szukasz shaderów dla Minecraft 1.5.2, najprawdopodobniej chcesz po prostu poprawić obraz w grze. Aby było to możliwe, programy przeszły przez „rury ogniowe, wodne i miedziane”. Shadery zostały przetestowane i dopracowane. W rezultacie stało się jasne, że to narzędzie ma zalety i wady.

Oczywiście prostota w kompilacji różnych algorytmów to ogromny plus. Jest to zarówno elastyczność, jak i zauważalne uproszczenie procesu tworzenia gry, a co za tym idzie obniżenie kosztów. Powstałe wirtualne sceny stają się bardziej złożone i realistyczne. Również sam proces tworzenia staje się wielokrotnie szybszy.

Z niedociągnięć warto zauważyć tylko, że będziesz musiał nauczyć się jednego z języków programowania, a także wziąć pod uwagę, że różne modele inny zestaw algorytmów jest umieszczony na kartach graficznych.

Instalacja

Jeśli znalazłeś pakiet shaderów dla Minecrafta, musisz zrozumieć, że w jego instalacji jest wiele pułapek. Mimo słabnącej już popularności tej gry, jej wierni fani wciąż pozostają. Nie każdy lubi grafikę, zwłaszcza w 2017 roku. Niektórzy myślą, że dzięki shaderom będą mogli to poprawić. W teorii to stwierdzenie jest poprawne. Ale w praktyce niewiele się zmieni.

Ale jeśli nadal szukasz sposobów na „Minecraft 1.7”, to przede wszystkim bądź ostrożny. Sam proces nie jest skomplikowany. Ponadto wraz z każdym pobranym plikiem znajduje się instrukcja jego instalacji. Najważniejsze jest sprawdzenie wersji gry i shadera. W przeciwnym razie optymalizator zawiedzie.

W Internecie jest wiele miejsc, w których można zainstalować i pobrać takie narzędzie. Następnie musisz rozpakować archiwum do dowolnego folderu. Znajdziesz tam plik „GLSL-Shaders-Mod-1.7-Installer.jar”. Po uruchomieniu zostanie wyświetlona ścieżka do gry, jeśli jest poprawna, zgadzaj się ze wszystkimi kolejnymi instrukcjami.

Następnie musisz przenieść folder „shaderpacks” do „.minecraft”. Teraz, po uruchomieniu programu uruchamiającego, musisz przejść do ustawień. Tutaj, jeśli instalacja przebiegła prawidłowo, pojawi się wiersz „Shaders”. Możesz wybrać żądany pakiet z całej listy.

Jeśli potrzebujesz shaderów dla Minecrafta 1.7.10, po prostu znajdź pakiet cieniujący wymaganej wersji i zrób to samo. Wersje niestabilne można znaleźć w Internecie. Czasami trzeba zmienić, ponownie zainstalować i poszukać odpowiedniego. Lepiej spojrzeć na recenzje i wybrać te najpopularniejsze.

Dość częste pytanie dla ciekawskich graczy i początkujących twórców gier.

Shader (angielski shader - program do cieniowania) to program do karty graficznej, który jest używany w grafice 3D do zrozumienia końcowych cech obiektu lub obrazu, może obejmować prezentację absorpcji i rozpraszania światła, mapowanie tekstury, wyświetlanie i załamanie , cieniowanie, przemieszczenie powierzchni itp. duża liczba innych cech.

Shadery to małe, że tak powiem, „skrypty na kartę graficzną”. Pozwól, aby po prostu ucieleśnić takie różne efekty specjalne i efekty.

Czasami pikselowany (praca z obrazami - to znaczy albo z pełnym ekranem, albo z teksturami) i wierzchołkami (praca z obiektami 3D). Na przykład przy użyciu pixel shaderów, efektów takich jak tekstury 3D (bump), tekstury paralaksy, promienie słoneczne (sunshafts) a la Crisis, rozmycie zasięgu, po prostu rozmycie ruchu, animowane tekstury (woda, lawa, ... ), HDR, anty -aliasing, cienie (na podstawie przepływu pracy ShadowMaps) i inne. Vertex Shadery wykonują animację trawy, bohaterów, drzew, tworzą fale na wodzie (takie jak duże) itd. Im trudniejszy (wyższa jakość, nowocześniejszy) efekt, tym więcej poleceń potrzebuje w kodzie shadera. Ale shadery w różnych wersjach (1.1 - 5.0) obsługują różną liczbę poleceń: im wyższa wersja, tym więcej poleceń możesz użyć. Z tego powodu nierealne jest zaimplementowanie niektórych procesów technologicznych na najniższych shaderach. Na przykład, z tego konkretnego powodu, najnowsza Dead Space 2 prosi o trzecią wersję shaderów (zarówno pikselową, jak i wierzchołkową) - ponieważ ma taki model oświetlenia, który można zaimplementować tylko na 3 i wyższych wersjach shaderów.

Opcje cieniowania

W zależności od etapu potoku, shadery dzielą się na określoną liczbę typów: wierzchołek, fragment (piksel) i geometryczny. Cóż, nowe typy potoków nadal mają shadery teselacji. Nie będziemy szczegółowo omawiać potoku graficznego, nadal myślę, aby nie napisać osobnego artykułu na ten temat dla tych, którzy zdecydują się studiować shadery i programowanie graficzne. Napisz w komentarzach jeśli jesteś ciekawy, będę miał informację, warto marnować czas.

Moduł cieniowania wierzchołków:
Vertex Shadery tworzą animacje bohaterów, trawy, drzew, tworzą fale na wodzie i prawie wszystkie inne rzeczy. W Vertex Shader programista ma dostęp do danych związanych z wierzchołkami, na przykład: współrzędne wierzchołka w przestrzeni, jego współrzędne tekstury, jego kolor i wektor normalny.

Cieniowanie geometryczne:
Geometryczne shadery są gotowe do budowania najnowszej geometrii i mogą być używane do tworzenia cząstek, konfigurowania szczegółów modelu w locie, kształtowania sylwetek i nie tylko. W przeciwieństwie do poprzedniego wierzchołka jesteśmy gotowi do przetworzenia nie tylko jednego wierzchołka, ale także całego prymitywu. Prymityw może być segmentem (2 wierzchołki) i trójkątem (3 wierzchołki), a jeśli jest informacja o sąsiednich wierzchołkach (przyleganie angielskie) dla trójkąta prostego, można przetworzyć do 6 wierzchołków.

Pixel Shader:
Pixel shadery wykonują mapowanie tekstur, oświetlenie i różne efekty tekstur, takie jak odbicie, załamanie, mgła, Bump Mapping itp. Pixel shadery są podobnie używane do post-efektów. Pixel Shader działa z momentami bitmapowymi i teksturami - przetwarza dane związane z pikselami (na przykład kolor, głębię, współrzędne tekstury). Pixel Shader jest używany na ostatnim etapie potoku graficznego do utworzenia fragmentu obrazu.

Konkluzja: shader to różne efekty na obrazie, tak jak przetwarzasz swoje zdjęcie w telefonie w różnych odcieniach lub wzorach.