Какво представляват шейдърите в една игра? Как да инсталирам шейдъри на Minecraft? Какво отговарят шейдърите.

С глобалната компютъризация огромен брой неясни термини дойдоха в нашия свят. Справянето с всички тях не е толкова лесно, колкото изглежда на пръв поглед. Много от тях имат подобни имена, много от тях имат широка функционалност. Време е да разберете какво представлява шейдърът, откъде идва, за какво е и какво се случва.

Оптимизатор

Най-вероятно сте запален играч на Minecraft и затова дойдохте да разберете какво е това. Веднага трябва да се отбележи, че концепцията за "шейдър" е тихо отделена от тази игра и може да "живее" отделно от нея. Точно като модификациите. Следователно не е необходимо да се свързват тясно тези две понятия.

По принцип шейдърът идва от програмирането, той се появи като помощник на специалисти. Вероятно ще е шумно да наречем този инструмент оптимизатор, но наистина подобрява картината в игрите. Така че, когато вече сте започнали приблизително да разбирате какво е, нека да преминем към точното тълкуване.

Интерпретация

Какво е шейдър? който се изпълнява от процесорите на видеокартата. Тези инструменти са разработени на специален език. В зависимост от целта може да е различно. След това шейдърите условно се превеждат в инструкции за процесорите на графичния ускорител.

Приложение

Трябва веднага да се каже, че приложението като цяло е предопределено от целта. Програмите са вградени в процесорите на видеокартите, което означава, че работят върху параметрите на обекти и изображения на триизмерна графика. Те могат да изпълняват много задачи, включително работа с отражение, пречупване, потъмняване, ефекти на срязване и т.н.

Предпоставка

Хората се опитват да разберат какво е шейдър от дълго време. Дори преди тези програми, разработчиците правеха всичко на ръка. Процесът на формиране на изображение от някои обекти не беше автоматизиран. Преди да се роди играта, разработчиците направиха собствено изобразяване. Те работеха с алгоритъма, компилираха го за различни задачи. Така се появиха инструкции за нанасяне на текстури, видео ефекти и т.н.

Разбира се, някои процеси все още бяха вградени в работата на видеокартите. Разработчиците биха могли да използват такива алгоритми. Но не можаха да наложат своите алгоритми на видеокартата. Нестандартните инструкции можеха да се изпълняват от CPU, който беше по-бавен от GPU.

Пример

За да разберете разликата, си струва да разгледате няколко примера. Очевидно в играта рендирането може да бъде хардуерно и софтуерно. Например, всички помним известния Quake 2. Така че водата в играта може да бъде просто син филтър, когато става въпрос за хардуерно изобразяване. Но със софтуерна намеса се появи пръскане на вода. Същата история с co в CS 1.6. Хардуерното изобразяване даде само бяла светкавица, докато софтуерното изобразяване добави пикселизиран екран.

Достъп

Така стана ясно, че е необходимо да се решат подобни проблеми. Графичните ускорители започнаха да разширяват броя на алгоритмите, които бяха популярни сред разработчиците. Стана ясно, че е невъзможно всичко да се „бутне“. Беше необходимо да се отвори достъп за специалисти до видеокартата.

Преди да има игри като Minecraft с модове и шейдъри, на разработчиците беше дадена възможността да работят с GPU блокове в тръбопроводи, които биха могли да отговарят за различни инструкции. Така станаха известни програми с името "шейдър". За да ги създадете, специално разработени езици за програмиране. И така, видеокартите започнаха да се зареждат не само със стандартна "геометрия", но и с инструкции за процесора.

Когато такъв достъп стана възможен, започнаха да се отварят нови възможности за програмиране. Специалистите могат да решават математически задачи на GPU. Такива изчисления станаха известни като GPGPU. Този процес изисква специални инструменти. От nVidia CUDA, от Microsoft DirectCompute, както и рамката OpenCL.

Видове

Колкото повече хора научаваха какво представляват шейдърите, толкова повече информация се разкриваше за тях и техните възможности. Първоначално ускорителите имаха три процесора. Всеки отговаряше за собствения си тип шейдър. С течение на времето те бяха заменени от универсален. Всеки от тях имаше специфичен набор от инструкции, който имаше три типа шейдъри наведнъж. Въпреки сливането на творбата, описание на всеки вид е оцеляло до наши дни.

Типът на върховете работи с върховете на форми, които имат много лица. Тук има много инструменти. Например, говорим за текстурни координати, допирателни вектори, бинорми или нормали.

Геометричният тип работеше не само с един връх, а с целия примитив. Пикселният е предназначен за обработка на фрагменти от растерни илюстрации и текстури като цяло.

В игрите

Ако търсите шейдъри за Minecraft 1.5.2, най-вероятно просто искате да подобрите картината в играта. За да направят това възможно, програмите преминаха през „пожар, вода и медни тръби“. Шейдърите бяха тествани и подобрени. В резултат на това стана ясно, че този инструмент има предимства и недостатъци.

Разбира се, простотата при компилиране на различни алгоритми е огромен плюс. Това е едновременно гъвкавост и забележимо опростяване в процеса на разработка на играта и следователно намаляване на разходите. Получените виртуални сцени стават по-сложни и реалистични. Освен това самият процес на разработка става многократно по-бърз.

От недостатъците си струва да се отбележи само, че ще трябва да научите един от езиците за програмиране, както и да вземете предвид, че различните модели видеокарти разполагат с различен набор от алгоритми.

Инсталация

Ако сте намерили пакет за шейдъри за Minecraft, трябва да разберете, че има много подводни камъни при инсталирането му. Въпреки вече изчезващата популярност на тази игра, нейните верни фенове все още остават. Не всеки харесва графиката, особено през 2017 г. Някои вярват, че благодарение на шейдърите ще могат да го подобрят. Теоретично това твърдение е правилно. Но на практика ще промените малко.

Но ако все още търсите начини за Minecraft 1.7, тогава, на първо място, бъдете внимателни. Самият процес не е труден. Освен това, заедно с всеки изтеглен файл, има инструкция за инсталирането му. Основното нещо е да проверите версиите на играта и шейдъра. В противен случай оптимизаторът няма да работи.

Има много места в Интернет, където можете да инсталирате и изтеглите такъв инструмент. След това трябва да разархивирате архива във всяка папка. Там ще намерите файла "GLSL-Shaders-Mod-1.7-Installer.jar". След стартиране ще ви бъде показан пътят към играта, ако е правилен, тогава се съгласете с всички следващи инструкции.

След като трябва да преместите папката "shaderpacks" в ".minecraft". Сега, когато стартирате стартовия панел, ще трябва да отидете в настройките. Тук, ако инсталацията е преминала правилно, ще се появи редът "Шейдъри". От целия списък можете да изберете желания пакет.

Ако имате нужда от шейдъри за Minecraft 1.7.10, просто намерете пакета шейдъри на желаната версия и направете същото. В интернет може да се намерят нестабилни версии. Понякога трябва да ги смените, да ги инсталирате отново и да потърсите правилния. По-добре е да разгледате рецензиите и да изберете най-популярните.

Въведение

Светът на 3D графиката, включително игрите, е изпълнен с термини. Термини, които не винаги имат единственото правилно определение. Понякога едни и същи неща се наричат ​​по различен начин и обратно, същият ефект може да бъде наречен в настройките на играта или „HDR“, след това „Bloom“, след това „Glow“, след това „Постобработка“. Повечето хора от разработчиците, които се хвалят с това, което са вградили в графичния си двигател, не е ясно какво всъщност е имало предвид.

Статията има за цел да разбере какво означават някои от тези думи, най-често използвани в такива случаи. В рамките на тази статия няма да говорим за всички термини на 3D графика, а само за тези, които напоследък станаха по-широко разпространени като отличителни черти и технологии, използвани в игровите графични двигатели и като имена за графичните настройки на съвременните игри. За да започнете, силно ви препоръчвам да се запознаете с.

Ако нещо в тази статия и в статиите на Александър не ви е ясно, тогава има смисъл да започнете от най-рано, от. Тези статии вече са малко остарели, разбира се, но основните, най-първоначалните и важни данни са налице. Ще говорим за повече термини на "високо ниво". Трябва да имате основните концепции за 3D графики в реално време и дизайна на графичния конвейер. От друга страна, не очаквайте математически формули, академична прецизност и примери за код – не за това е тази статия. Условия

Списък на термините, описани в статията:

шейдър

Шейдърът в широк смисъл е програма за визуално определяне на повърхността на обект. Това може да бъде описание на осветление, текстуриране, последваща обработка и т.н. Шейдърите са израснали от работата на Cook (дървета на сенките на Кук) и Perlin (езикът на пикселния поток на Perlin). Сега най-известните шейдъри са RenderMan Shading Language. Програмируемите шейдъри са въведени за първи път в RenderMan на Pixar, дефинирани са няколко типа шейдъри там: шейдъри на светлинни източници, повърхностни шейдъри, шейдъри за изместване, шейдъри за обем, шейдъри за изображения. Тези шейдъри най-често се изпълняват в софтуер от мейнфрейм процесори и нямат пълна хардуерна реализация. Освен това много изследователи описват езици, подобни на RenderMan, но те вече са проектирани за хардуерно ускорение: системата PixelFlow (Olano и Lastra), Quake Shader Language (използван от id Software в графичния двигател на играта Quake III, който описва многопроходно изобразяване) и др. Peercy и др. разработиха техника за изпълнение на програми с цикли и условия на традиционни хардуерни архитектури, използващи множество проходи за изобразяване. Шейдърите на RenderMan бяха разделени на няколко Само пасовете, които бяха комбинирани в фреймбуфера. По-късно се появиха езици, на които виждаме хардуерно ускорено в DirectX и OpenGL. Ето как шейдърите бяха адаптирани за графични приложения в реално време.

Ранните видеочипове не бяха програмируеми и изпълняваха само предварително програмирани действия (фиксирана функция), например, алгоритъмът за осветление беше твърдо фиксиран в хардуера и нищо не можеше да се промени. След това компаниите за видеочипове постепенно въведоха елементи за програмиране в своите чипове, първоначално бяха много слаби възможности (NV10, известен като NVIDIA GeForce 256, вече беше способен на някои примитивни програми), които не получиха софтуерна поддръжка в Microsoft DirectX API, но с С течение на времето възможностите непрекъснато се разширяват. Следващата стъпка беше както за NV20 (GeForce 3), така и за NV2A (видео чипа, използван в игровата конзола на Microsoft Xbox), които станаха първите чипове с хардуерна поддръжка за DirectX API шейдъри. Версията на Shader Model 1.0/1.1, която се появи в DirectX 8, беше много ограничена, всеки шейдър (особено пикселните) можеше да бъде сравнително малък по дължина и да комбинира много ограничен набор от команди. По-късно Shader Model 1 (SM1 за кратко) беше подобрен с Pixel Shaders версия 1.4 (ATI R200), който предлагаше повече гъвкавост, но също така беше твърде ограничен. Шейдърите от онова време са написани на така наречения асемблерен език за шейдъри, който е близък до асемблера за универсални процесори. Ниското му ниво затруднява разбирането на кода и програмирането, особено когато програмният код е голям, защото е далеч от елегантността и структурата на съвременните езици за програмиране.

Shader Model 2.0 (SM2), който се появи в DirectX 9 (който беше поддържан от видеочипа ATI R300, който стана първият графичен процесор, поддържащ шейдър модел версия 2.0), значително разшири възможностите на шейдърите в реално време, предлагайки по-дълго и повече сложни шейдъри и забележимо разширен набор от команди. Беше добавена възможността за изчисления с плаваща запетая в пикселни шейдъри, което също беше голямо подобрение. DirectX 9, под формата на SM2 възможности, също въведе език за шейдъри от високо ниво (HLSL), който е много подобен на езика C. И ефективен компилатор, който превежда HLSL програмите в код от ниско ниво, "разбираем" от хардуера. Освен това са налични няколко профила, предназначени за различни хардуерни архитектури. Сега разработчикът може да напише един HLSL шейдърен код и да го компилира с помощта на DirectX в оптимална програма за видеочипа, инсталиран от потребителя. След това излязоха чипове от NVIDIA, NV30 и NV40, които подобриха възможностите на хардуерните шейдъри още една стъпка, добавяйки още по-дълги шейдъри, възможност за динамични преходи във върхови и пикселни шейдъри, възможност за извличане на текстури от шейдъри на върха, и т.н. Оттогава не е имало качествени промени, те се очакват към края на 2006 г. в DirectX 10...

Като цяло, шейдърите добавиха много нови възможности към графичния конвейер за трансформиране и осветяване на върховете и персонализиране на пикселите по начина, който разработчиците на всяко конкретно приложение искат. И все пак, възможностите на хардуерните шейдъри все още не са напълно разкрити в приложенията и с увеличаването на техните възможности във всяко ново поколение хардуер, скоро ще видим нивото на същите тези шейдъри RenderMan, които някога изглеждаха недостижими за ускорителите на видео игри . Досега само два типа шейдъри са дефинирани в моделите на шейдъри в реално време, поддържани в момента от хардуерните видео ускорители: и (в дефиницията на DirectX 9 API). В бъдеще DirectX 10 обещава да добави .

Вертекс шейдър (Vertex Shader)

Върховите шейдъри са програми, изпълнявани от видеочипове, които извършват математически операции с върхове (върх, те съставят 3D обекти в игри), с други думи, те предоставят възможност за изпълнение на програмируеми алгоритми за промяна на параметрите на върховете и тяхното осветяване (T&L - Transform & Осветление). Всеки връх се дефинира от няколко променливи, например позицията на връх в 3D пространството се дефинира от координати: x, y и z. Върховете могат да бъдат описани и с цветови характеристики, текстурни координати и т.н. Върховите шейдъри, в зависимост от алгоритмите, променят тези данни в хода на своята работа, например чрез изчисляване и записване на нови координати и/или цвят. Това означава, че входът към шейдера за връх е данни за един връх от геометрията, която в момента се обработва. Обикновено това са координати в пространството, нормално, цветови компоненти и текстурни координати. Получените данни от изпълнената програма служат като вход към следващата част от конвейера, растеризаторът прави линейна интерполация на входните данни за повърхността на триъгълника и за всеки пиксел изпълнява съответния пикселен шейдър. Много прост и груб (но илюстративен, надявам се) пример: шейдърът на върховете ви позволява да вземете 3D сферичен обект и да използвате шейдъра за връх, за да го превърнете в зелен куб :).

Преди появата на видеочипа NV20, разработчиците имаха два начина: или да използват свои собствени програми и алгоритми, които променят параметрите на върховете, но тогава всички изчисления ще се извършват от CPU (софтуер T&L) или разчитат на фиксирани алгоритми във видеото чипове с поддръжка за хардуерна трансформация и осветление (Hardware T&L). Първият модел на шейдъри DirectX означаваше голяма крачка напред от фиксирани функции за трансформиране и върхово осветление към напълно програмируеми алгоритми. Стана възможно например алгоритъмът за обработка на кожата да се изпълни изцяло върху видеочипове, а преди това единствената възможност беше изпълнението им на универсални централни процесори. Сега, с възможностите, значително подобрени от времето на споменатия чип NVIDIA, вече можете да правите много с върхове, използвайки шейдъри на върхове (с изключение на създаването им, може би) ...

Примери за това как и къде се прилагат шейдерите на върхове:

Пиксел шейдър

Пикселните шейдъри са програми, изпълнявани от видеочипа по време на растеризация за всеки пиксел на изображението, те извършват семплиране на текстура и/или математически операции върху стойността на цвета и дълбочината (Z-буфер) на пикселите. Всички инструкции за пикселен шейдър се изпълняват пиксел по пиксел след завършване на операциите за трансформиране на геометрията и осветление. Пикселният шейдър, в резултат на своята работа, произвежда крайната стойност на цвета на пиксела и Z-стойността за следващия етап от графичния конвейер, смесване. Най-простият пример за пикселен шейдър, който може да бъде даден, е банално мултитекстуриране, просто смесване на две текстури (дифузна и светлинна, например) и прилагане на резултата от изчислението към пиксел.

Преди появата на видеочипове с хардуерна поддръжка за пикселни шейдъри, разработчиците имаха само обичайните възможности за мултитекстуриране и алфа смесване, което значително ограничаваше възможностите за много визуални ефекти и не позволяваше да се прави голяма част от това, което сега е налично. И ако нещо друго можеше да се направи програмно с геометрия, то с пиксели - не. Ранните версии на DirectX (до и включително 7.0) винаги извършваха всички изчисления за всеки връх и предлагаха много ограничена функционалност за осветяване на пиксел (помнете EMBM - картографиране на бум на околната среда и DOT3) в последните версии. Пикселните шейдъри направиха възможно осветяването на всяка повърхност пиксел по пиксел, като се използват материали, програмирани от разработчиците. Версия 1.1 пикселни шейдъри, които се появиха в NV20 (в смисъл на DirectX), можеха не само да правят мултитекстуриране, но и много повече, въпреки че повечето игри, използващи SM1, просто използваха традиционно мултитекстуриране на повечето повърхности, изпълнявайки по-сложни пикселни шейдъри само на част от повърхности, за създаване на различни специални ефекти (всеки знае, че водата все още е най-често срещаният пример за използване на пикселни шейдъри в игрите). Сега, след появата на SM3 и видеочипове, които ги поддържат, възможностите на пикселните шейдъри нараснаха до точката, в която дори и raytracing може да се направи с тяхна помощ, макар и с някои ограничения засега.

Примери за използване на пикселни шейдъри:

Процедурни текстури (Процедурни текстури)

Процедурните текстури са текстури, които се описват с математически формули. Такива текстури не заемат място във видеопаметта, те се създават от пикселния шейдър "в движение", всеки техен елемент (тексел) се получава в резултат на изпълнението на съответните команди на шейдъра. Най-често срещаните процедурни текстури са: различни видове шум (например фрактален шум), дърво, вода, лава, дим, мрамор, огън и т.н., тоест тези, които могат да бъдат описани сравнително просто математически. Процедурните текстури също позволяват анимирани текстури само с лека модификация на математическите формули. Например, облаците, направени по този начин, изглеждат доста прилично както в динамика, така и в статика.

Предимствата на процедурните текстури също включват неограничено ниво на детайлност за всяка текстура, просто няма да има пикселизация, текстурата, сякаш, винаги се генерира до размера, необходим за нейното показване. Голям интерес представлява анимираният, с негова помощ можете да правите вълни по водата, без да използвате предварително изчислени анимирани текстури. Друг плюс на такива текстури е, че колкото повече се използват в продукта, толкова по-малко работа за художниците (макар и повече за програмистите) за създаване на обикновени текстури.

За съжаление, процедурните текстури все още не са използвани правилно в игрите, в реалните приложения все още често е по-лесно да се зарежда обикновена текстура, обемите на видео паметта нарастват със скокове и граници, най-модерните ускорители вече имат 512 мегабайта специална видео памет, което ви трябва повече от - нещо за заемане. Освен това те все още често правят обратното - за ускоряване на математиката в пикселни шейдъри се използват таблици за търсене (LUT) - специални текстури, съдържащи предварително изчислени стойности, получени в резултат на изчисления. За да не се броят няколко математически команди за всеки пиксел, те просто четат предварително изчислени стойности от текстурата. Но колкото по-далеч, толкова по-силен акцентът трябва да бъде изместен точно към математическите изчисления, вземете същите видеочипове от ново поколение ATI: RV530 и R580, които имат 12 и 48 пиксела процесори за всеки 4 и 16 текстурни единици, съответно. Особено що се отнася до 3D текстури, защото ако 2D текстурите могат да се поставят в локалната памет на ускорителя без никакви проблеми, тогава 3D текстурите изискват много повече памет.

Примери за процедурни текстури:

Картиране на неравности/Огледално картографиране на неравности

Bumpmapping е техника за симулиране на неравности (или микрорелеф, ако предпочитате) върху равна повърхност без много изчислителни усилия и промени в геометрията. За всеки пиксел от повърхността се извършва изчисление на осветлението въз основа на стойностите в специална карта на височината, наречена bumpmap. Това обикновено е 8-битова черно-бяла текстура и стойностите на цвета на текстурата не са картографирани като нормални текстури, а се използват за описване на грапавостта на повърхността. Цветът на всеки тексел определя височината на съответната точка в терена, по-големите стойности означават по-голяма височина над оригиналната повърхност, а по-малките стойности, съответно, по-малко. Или обратното.

Степента на осветеност на дадена точка зависи от ъгъла на падане на светлинните лъчи. Колкото по-малък е ъгълът между нормата и светлинния лъч, толкова по-голяма е осветеността на повърхностната точка. Тоест, ако вземем плоска повърхност, тогава нормалите във всяка точка ще бъдат еднакви и осветеността също ще бъде еднаква. И ако повърхността е неравна (всъщност почти всички повърхности в действителност), тогава нормалите във всяка точка ще бъдат различни. И осветлението е различно, в един момент ще е повече, в другия - по-малко. Оттук и принципът на bumpmapping - за симулиране на неравности за различни точки от полигона се задават нормали към повърхността, които се вземат предвид при изчисляване на осветеността на пиксел. В резултат на това се получава по-естествено изображение на повърхността, bumpmapping дава на повърхността по-големи детайли, като неравности по тухла, пори по кожата и т.н., без да увеличава геометричната сложност на модела, тъй като изчисленията се извършват на ниво пиксел. Освен това, когато позицията на източника на светлина се промени, осветяването на тези неравности се променя правилно.

Разбира се, върховото осветление е много по-просто изчислително, но изглежда твърде нереалистично, особено при относително ниска полигонална геометрия, цветната интерполация за всеки пиксел не може да възпроизведе стойности, по-големи от изчислените стойности за върховете. Тоест пикселите в средата на триъгълника не могат да бъдат по-ярки от фрагментите близо до върха. Следователно области с рязка промяна в осветлението, като отблясъци и светлини, които са много близо до повърхността, няма да бъдат физически показани правилно и това ще бъде особено забележимо в динамиката. Разбира се, проблемът може да бъде частично решен чрез увеличаване на геометричната сложност на модела, като го разделите на повече върхове и триъгълници, но осветлението пиксел по пиксел би било най-добрият вариант.

За да продължим, е необходимо да си припомним компонентите на осветлението. Цветът на точката на повърхността се изчислява като сума от околните, дифузните и огледалните компоненти от всички светлини в сцената (в идеалния случай от всички, често много се пренебрегват). Приносът към тази стойност от всеки източник на светлина зависи от разстоянието между източника на светлина и точка на повърхността.

Компоненти за осветление:

И сега нека добавим bumpmapping към това:

Униформен (амбиентен) компонент на осветлението - приближение, "начално" осветление за всяка точка от сцената, при което всички точки са осветени еднакво и осветеността не зависи от други фактори.
Дифузният компонент на осветлението зависи от позицията на източника на светлина и от нормата на повърхността. Този компонент на осветлението е различен за всеки връх на обекта, което им придава обем. Светлината вече не изпълва повърхността със същия нюанс.
Отблясък (огледален) компонент на осветлението се проявява в отблясъците на отражението на светлинните лъчи от повърхността. За да се изчисли, освен вектора на позицията на източника на светлина и нормала се използват още два вектора: вектора на посоката на погледа и вектора на отражението. Моделът на огледално осветление е предложен за първи път от Phong (Phong Bui-Tong). Тези акценти значително увеличават реализма на изображението, тъй като редките реални повърхности не отразяват светлината, така че огледалният компонент е много важен. Особено в движение, защото отблясъците веднага показват промяна в позицията на камерата или на самия обект. В бъдеще изследователите измислиха други начини за изчисляване на този компонент, по-сложни (Blinn, Cook-Torrance, Ward), като се вземат предвид разпределението на светлинната енергия, нейното поглъщане от материалите и разсейването под формата на дифузен компонент.

И така, Specular Bump Mapping се получава по този начин:

И нека видим същото на примера с играта Call of Duty 2:


Първият фрагмент на картината се изобразява без bumpmapping (), вторият (горе вдясно) е bumpmapping без огледален компонент, третият е с огледален компонент с нормален размер, който се използва в играта, и последният, вдясно отдолу, е с максималната възможна стойност на огледалния компонент.

Що се отнася до първото хардуерно приложение, някои видове bump mapping (Emboss Bump Mapping) започнаха да се използват още в дните на видеокартите, базирани на NVIDIA Riva TNT чипове, но техниките от онова време бяха изключително примитивни и не бяха широко използвани. Следващият известен тип беше Environment Mapped Bump Mapping (EMBM), но само видеокартите Matrox имаха хардуерна поддръжка за него в DirectX по това време и отново използването му беше много ограничено. След това дойде Dot3 Bump Mapping и видеочиповете от онова време (GeForce 256 и GeForce 2) изискваха три преминавания, за да изпълнят напълно такъв математически алгоритъм, тъй като те са ограничени до две текстури, използвани едновременно. Започвайки с NV20 (GeForce3), стана възможно да се направи същото с един проход с помощта на пикселни шейдъри. Освен това. Те започнаха да използват по-ефективни техники, като напр.

Примери за използване на bumpmapping в игри:


Картографирането на изместване е метод за добавяне на детайли към 3D обекти. За разлика от bumpmapping и други методи пиксел по пиксел, когато картите на височината правилно моделират само осветяването на точка, но нейната позиция в пространството не се променя, което създава само илюзията за нарастваща сложност на повърхността, картите на изместване ви позволяват да получите истински комплекс 3D обекти от върхове и полигони, без ограничения, присъщи на методите пиксел по пиксел. Този метод променя позицията на върховете на триъгълниците, като ги измества по нормата със стойност въз основа на стойностите в картите на изместване. Картата на изместване обикновено е черно-бяла текстура и стойностите в нея се използват за определяне на височината на всяка точка на повърхността на обекта (стойностите могат да се съхраняват като 8-битови или 16-битови числа), подобно на bumpmap. Често се използват карти на изместване (в този случай те се наричат ​​още карти на височина) за създаване на земна повърхност с хълмове и долини. Тъй като теренът се описва с 2D карта на изместване, е относително лесно да се деформира, ако е необходимо, тъй като това изисква само модифициране на картата на изместване и изобразяване на повърхността от нея в следващия кадър.

Визуално създаването на пейзаж с помощта на наслагване на карти на изместване е показано на снимката. Първоначалните бяха 4 върха и 2 полигона, в крайна сметка получихме пълноценно парче от пейзажа.

Голямото предимство на наслагването на карти на изместване не е просто възможността за добавяне на детайли към повърхност, а почти пълното създаване на обект. Взима се нискополис обект, разделен (теселиран) на по-голям брой върхове и многоъгълници. Върховете, получени в резултат на теселацията, след това се изместват нормално въз основа на стойността, прочетена в картата на изместване. В резултат на това получаваме сложен 3D обект от обикновен, използвайки съответната карта на изместване:


Броят на триъгълниците, създадени чрез теселация, трябва да бъде достатъчно голям, за да улови всички детайли, дадени от картата на изместване. Понякога допълнителни триъгълници се създават автоматично с помощта на N-кръпки или други методи. Картите на изместване се използват най-добре във връзка с bumpmapping за създаване на фини детайли, където правилното осветление пиксел по пиксел е достатъчно.

Картографирането на изместване за първи път получи поддръжка в DirectX 9.0. Това беше първата версия на този API, която поддържа техниката за картографиране на изместване. DX9 поддържа два типа наслагвания на карта на изместване, филтрирани и предварително извадени. Първият метод беше подкрепен от вече забравения видеочип MATROX Parhelia, а вторият - от ATI RADEON 9700. Филтрираният метод се различава по това, че позволява използването на mip нива за карти на изместване и прилагане на трилинейно филтриране за тях. При този метод нивото mip на картата на изместване се избира за всеки връх въз основа на разстоянието от върха до камерата, т.е. нивото на детайлност се избира автоматично. По този начин се постига почти равномерно разделяне на сцената, когато триъгълниците са приблизително еднакви по размер.

Наслояването на карти на изместване може по същество да се разглежда като метод за компресиране на геометрията, като използването на карти на изместване намалява размера на паметта, необходима за определено количество детайли в 3D модел. Обемните геометрични данни се заменят с прости 2D текстури на изместване, обикновено 8-битови или 16-битови. Това намалява изискванията за памет и честотна лента, необходими за доставяне на геометрични данни към видеочипа, а тези ограничения са едни от основните за днешните системи. Или, за еднакви изисквания за честотна лента и памет, наслагването на карти на изместване позволява много по-сложни геометрично 3D модели. Използването на модели с много по-малка сложност, когато се използват единици от хиляди вместо десетки или стотици хиляди триъгълници, също прави възможно ускоряването на тяхната анимация. Или го подобрете, като приложите по-сложни сложни алгоритми и техники, като например симулация на плат.

Друго предимство е, че използването на карти на изместване превръща сложните 3D полигонални мрежи в множество 2D текстури, които са по-лесни за манипулиране. Например, за организация можете да използвате редовно mipmapping за наслагване на карти на изместване. Освен това, вместо сравнително сложни алгоритми за компресиране на 3D мрежи, можете да използвате обичайните методи за компресиране на текстури, дори подобни на JPEG. А за процедурното създаване на 3D обекти можете да използвате обичайните алгоритми за двуизмерни текстури.

Но картите на изместване също имат някои ограничения, те не могат да се прилагат във всички ситуации. Например, гладки обекти, които не съдържат много фини детайли, ще бъдат по-добре представени като стандартни многоъгълни мрежи или други повърхности от по-високо ниво като кривите на Безие. От друга страна, много сложни модели като дървета или растения също не се представят лесно чрез карти на изместване. Има и проблеми с използваемостта, почти винаги са необходими специализирани помощни програми, защото е много трудно да се създават директно карти на изместване (освен ако не говорим за прости обекти като терен). Много от проблемите и ограниченията на картите на изместване са същите като тези на , тъй като двата метода са по същество две различни представяния на една подобна идея.

Като пример от реални игри ще дам игра, която използва извличане на текстура от върхов шейдър, функция, която се появи във видеочипове NVIDIA NV40 и модел шейдър 3.0. Текстурирането на върховете може да се използва за прост метод за наслагване на карти на изместване, изцяло изпълнен от видеочипа, без теселация (разделяне на повече триъгълници). Използването на такъв алгоритъм е ограничено, те имат смисъл само ако картите са динамични, тоест ще се променят в процеса. Например, това е изобразяване на големи водни повърхности, което направиха Pacific Fighters:


Normalmapping е подобрена версия на техниката bumpmapping, описана по-рано, разширена версия. Bumpmapping е разработен от Blinn през 1978 г., повърхностните нормали на този метод за картографиране на терена са модифицирани въз основа на информация от карти на неравности. Докато bumpmapping само модифицира съществуващата норма за повърхностни точки, normalmapping напълно замества нормалите, като извлича техните стойности от специално подготвена нормаална карта. Тези карти обикновено са текстури с предварително изчислени нормални стойности, съхранени в тях, представени като цветови компоненти RGB (все пак има специални формати за нормални карти, включително компресирани), за разлика от 8-битовите черно-бели карти на височина в bumpmapping.

Като цяло, подобно на bumpmapping, това също е "евтин" метод за добавяне на детайли към модели с относително ниска геометрична сложност, без да се използва по-реална геометрия, само по-напреднала. Едно от най-интересните приложения на техниката е да се увеличи значително детайлността на нискополисовите модели, използвайки нормални карти, получени чрез обработка на същия модел с висока геометрична сложност. Нормалните карти съдържат по-подробно описание на повърхността от bumpmapping и ви позволяват да представяте по-сложни форми. В средата на 90-те години на миналия век се появиха идеи за получаване на информация от обекти с висока детайлност, но тогава ставаше дума за използване на . По-късно, през 1998 г., бяха представени идеи за прехвърляне на детайли на нормалната карта от модели с висок поли към модели с нисък поли.

Нормалните карти осигуряват по-ефективен начин за съхраняване на подробни данни за повърхността, отколкото просто използване на голям брой полигони. Единственото основно ограничение е, че те не са подходящи за големи детайли, тъй като нормалното картографиране всъщност не добавя многоъгълници или променя формата на обекта, а само му придава вид. Това е просто симулация на детайлите, базирана на изчисляване на осветлението на ниво пиксел. На екстремните полигони на обекта и големи ъгли на наклон на повърхността това се вижда много ясно. Следователно, най-разумният начин за прилагане на нормално картографиране е да направите нискополигоналния модел достатъчно детайлен, за да запази основната форма на обекта, и да използвате нормални карти, за да добавите по-фини детайли.

Нормалните карти обикновено се създават от две версии на модел, нисък и висок поли. Нискополигоналният модел се състои от минимум геометрия, основни форми на обекта, а високополигоналният модел съдържа всичко необходимо за максимална детайлност. След това, с помощта на специални помощни програми, те се сравняват един с друг, разликата се изчислява и съхранява в текстура, наречена нормален карта. Когато го създавате, можете допълнително да използвате карта на удари за много малки детайли, които не могат да бъдат моделирани дори във високополигонален модел (пори на кожата, други малки вдлъбнатини).

Нормалните карти първоначално са били представени като обикновени RGB текстури, където цветовите компоненти R, G и B (от 0 до 1) се интерпретират като координати X, Y и Z. Всеки тексел в нормална карта е представен като нормален на повърхностна точка . Нормалните карти могат да бъдат два вида: с координати в пространството на модела (обща координатна система) или допирателното пространство (терминът на руски език е "тангентно пространство", локалната координатна система на триъгълник). Вторият вариант е по-често използван. Когато нормалните карти са представени в пространството на модела, те трябва да имат три компонента, тъй като всички посоки могат да бъдат представени, а когато са в допирателното пространство, можете да се справите с два компонента и да получите третия в пикселния шейдър.

Съвременните приложения в реално време все още изостават от предварително изобразената анимация по отношение на качеството на изображението, това се отнася преди всичко за качеството на осветлението и геометричната сложност на сцените. Броят на върховете и триъгълниците, изчислени в реално време, е ограничен. Ето защо методите за намаляване на размера на геометрията са много важни. Преди нормалното картографиране бяха разработени няколко такива метода, но моделите с нисък полигон, дори и с неравномерно картографиране, се оказват значително по-лоши от по-сложните модели. Въпреки че нормалното картографиране има няколко недостатъка (най-очевидният е, че тъй като моделът остава нискополис, това лесно се вижда от ъгловите му граници), окончателното качество на изобразяване е значително подобрено, оставяйки геометричната сложност на моделите ниска. Напоследък ясно се вижда нарастването на популярността на тази техника и нейното използване във всички популярни двигатели за игри. Причината за това е комбинация от отлично резултатно качество и едновременно намаляване на изискванията за геометрична сложност на моделите. Техниката за нормално картографиране вече се използва почти навсякъде, всички нови игри я използват възможно най-широко. Ето само кратък списък с известни компютърни игри, използващи нормално картографиране: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, F.E.A.R., Quake 4. Всички те изглеждат много по-добре от игрите от миналото, също поради към използването на нормали на карти.

Има само една негативна последица от използването на тази техника - увеличаване на обема на текстурите. В края на краищата, нормалната карта силно влияе на това как ще изглежда обектът и тя трябва да бъде с достатъчно голяма резолюция, така че изискванията за видео памет и нейната честотна лента се удвояват (в случай на некомпресирани нормални карти). Но сега вече се произвеждат видеокарти с 512 MB локална памет, честотната му лента непрекъснато расте, методите за компресиране са разработени специално за нормални карти, така че тези малки ограничения всъщност не са много важни. Ефектът, който дава нормалното картографиране, е много по-голям, позволявайки използването на модели с относително нисък полигон, намалявайки изискванията за памет за съхранение на геометрични данни, подобрявайки производителността и давайки много приличен визуален резултат.

Картографиране на паралакс/Картографиране на изместване

Normalmapping, разработен през 1984 г., е последван от картографиране на релефни текстури, въведено от Olivera и Bishop през 1999 г. Това е метод за нанасяне на текстура въз основа на информация за дълбочината. Методът не намери приложение в игрите, но идеята му допринесе за продължаването на работата по паралаксното картографиране и неговото подобряване. Kaneko въведе паралаксното картографиране през 2001 г., което беше първият ефективен метод за показване на паралаксния ефект на пиксел. През 2004 г. Welsh демонстрира използването на паралаксно картографиране на програмируеми видеочипове.

Този метод има може би най-различни имена. Ще изброя тези, които срещнах: Parallax Mapping, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. В статията за краткост се използва първото име.
Parallaxmapping е друга алтернатива на техниките bumpmapping и normalmapping, която ви дава още повече детайли на повърхността, по-натуралистично изобразяване на 3D повърхности, също без прекалено голям удар в производителността. Тази техника е подобна на картографирането на изместване и на нормалното картографиране едновременно, това е нещо по средата. Методът също така е проектиран да показва повече детайли на повърхността, отколкото в оригиналния геометричен модел. Той е подобен на нормалното картографиране, но разликата е, че методът изкривява текстурното картографиране, като променя текстурните координати, така че когато погледнете повърхността от различни ъгли, тя изглежда изпъкнала, въпреки че в действителност повърхността е плоска и не се променя . С други думи, Parallax Mapping е техника за апроксимиране на ефекта от изместването на повърхностните точки в зависимост от промяната в гледната точка.

Техниката измества координатите на текстурата (поради което техниката понякога се нарича офсетно картографиране), така че повърхността да изглежда по-обемна. Идеята на метода е да върне текстурните координати на точката, където изгледният вектор пресича повърхността. Това изисква проследяване на лъчи за картата на височината, но ако тя няма твърде много променящи се стойности („гладка“ или „гладка“), тогава можете да се справите с приближение. Този метод е добър за повърхности с плавно променящи се височини, без да се изчисляват пресечки и големи стойности на отместване. Такъв прост алгоритъм се различава от нормалното картографиране само по три инструкции за пикселен шейдър: две математически инструкции и едно допълнително извличане на текстура. След като се изчисли новата координата на текстурата, тя се използва допълнително за четене на други текстурни слоеве: базова текстура, нормализирана карта и т.н. Този метод на паралаксно картографиране на съвременните видеочипове е почти толкова ефективен, колкото и конвенционалното текстурно картографиране и неговият резултат е по-реалистичен повърхностен дисплей в сравнение с обикновеното нормално картографиране.

Но използването на нормално паралаксно картографиране е ограничено до карти на височината с малка разлика в стойностите. "Стръмните" неравности се обработват неправилно от алгоритъма, появяват се различни артефакти, "плуващи" текстури и т.н. Разработени са няколко модифицирани метода за подобряване на техниката за паралаксно картографиране. Няколко изследователи (Yerex, Donnelly, Tatarchuk, Policarpo) са описали нови методи, които подобряват първоначалния алгоритъм. Почти всички идеи се основават на проследяване на лъчи в пикселния шейдър за определяне на пресечната точка на детайлите на повърхността един с друг. Модифицираните методи са получили няколко различни имена: Parallax Mapping with Occlusion, Parallax Mapping with Distance Functions, Parallax Occlusion Mapping. За краткост ще ги наречем всички Parallax Occlusion Mapping.

Методите за оклузия на паралакс също включват проследяване на лъчи за определяне на височини и отчитане на видимостта на тексели. В крайна сметка, когато се гледат под ъгъл спрямо повърхността, текселите се блокират един друг и, като се има предвид това, можете да добавите повече дълбочина към ефекта на паралакса. Полученото изображение става по-реалистично и такива подобрени методи могат да се използват за по-дълбок терен, чудесно е за изобразяване на тухлени и каменни стени, настилки и т.н. Трябва да се отбележи, че основната разлика между Parallax Mapping и Displacement Mapping е, че всички изчисления са на пиксел и не са превъзходни. Ето защо методът има имена като Virtual Displacement Mapping и Per-Pixel Displacement Mapping. Вижте снимката, трудно е за повярване, но тротоарните камъни тук са просто ефект пиксел по пиксел:

Методът ви позволява ефективно да показвате детайлни повърхности без милионите върхове и триъгълници, които биха били необходими при прилагането на тази геометрия. В същото време се запазва висока детайлност (с изключение на силуети/лица) и изчисленията на анимацията са значително опростени. Тази техника е по-евтина от използването на реална геометрия и използва значително по-малко полигони, особено в случаите с много фини детайли. Има много приложения за алгоритъма и той е най-подходящ за камъни, тухли и други подобни.

Освен това допълнително предимство е, че картите на височината могат да се променят динамично (водна повърхност с вълни, дупки от куршуми в стените и други). Недостатъците на метода са липсата на геометрично правилни силуети (ръбове на обекта), тъй като алгоритъмът е пиксел по пиксел и не представлява реално изместване. Но спестява производителност под формата на намаляване на натоварването върху трансформацията, осветлението и анимацията на геометрията. Спестява видео памет, необходима за съхраняване на големи количества геометрични данни. Технологията също има сравнително проста интеграция в съществуващи приложения и използване на познати помощни програми, използвани за нормално картографиране в процеса.

Техниката вече е използвана в реални игри от последно време. Досега те се справят с просто паралаксно картографиране, базирано на статични карти на височината, без проследяване на лъчи и изчисляване на пресичане. Ето примери за използване на паралаксно картографиране в игри:

Последваща обработка

В широк смисъл постобработката е всичко, което се случва след основните действия за изграждане на изображение. С други думи, последваща обработка е всяка промяна на изображение, след като то е било изобразено. Постобработката е набор от инструменти за създаване на специални визуални ефекти и те се създават след приключване на основната работа по изобразяването на сцената, тоест при създаване на ефекти за последваща обработка се използва готово растерно изображение.

Прост пример от фотографията: снимали сте красиво езеро със зеленина при ясно време. Небето е много светло, а дърветата са твърде тъмни. Зареждате снимка в графичен редактор и започвате да променяте яркостта, контраста и други параметри за области от изображението или за цялата картина. Но вече нямате възможност да променяте настройките на камерата, вие извършвате обработката на готовото изображение. Това е последваща обработка. Или друг пример: изолиране на фона в портретна снимка и прилагане на филтър за размазване към тази област за ефект на дълбочина на полето с по-голяма дълбочина. Тоест, когато промените или коригирате рамка в графичен редактор, вие извършвате последваща обработка. Същото може да се направи в играта, в реално време.

Има много различни възможности за обработка на изображение, след като е било изобразено. Вероятно всеки е виждал много така наречени графични филтри в графичните редактори. Точно това се нарича пост-филтри: размазване, откриване на ръбове, изостряне, шум, изглаждане, релеф и т.н. Що се отнася до 3D изобразяването в реално време, това се прави по следния начин - цялата сцена се изобразява в специална област, render target и след основното изобразяване това изображение се обработва допълнително с помощта на пикселни шейдъри и едва след това се показва на екрана. От ефектите за последваща обработка в игрите най-често се използват , . Има много други постефекти: шум, отблясъци, изкривяване, сепия и т.н.

Ето няколко ярки примера за последваща обработка в приложения за игри:

Висок динамичен обхват (HDR)

Високият динамичен обхват (HDR), приложен към 3D графики, се изобразява в широк динамичен диапазон. Същността на HDR е описанието на интензитета и цвета чрез реални физически величини. Обичайният модел за описание на изображението е RGB, където всички цветове са представени като сума от основните цветове: червено, зелено и синьо, с различни интензитети като възможни цели числа от 0 до 255 за всеки, кодирани с осем бита на цвят. Съотношението на максималния интензитет към минималния достъпен за показване от конкретен модел или устройство се нарича динамичен диапазон. Така динамичният диапазон на RGB модела е 256:1 или 100:1 cd/m 2 (два порядъка). Този модел за описване на цвят и интензитет обикновено се нарича нисък динамичен диапазон (LDR).

Възможните стойности на LDR за всички случаи очевидно не са достатъчни, човек може да види много по-голям обхват, особено при ниска интензивност на светлината, а моделът RGB е твърде ограничен в такива случаи (и при висок интензитет също). Динамичният диапазон на човешкото зрение е от 10 -6 до 10 8 cd/m 2 , тоест 100000000000000:1 (14 порядъка). В същото време не можем да видим целия диапазон, но обхватът, който се вижда от окото във всеки даден момент, е приблизително равен на 10 000:1 (четири порядъка). Зрението се адаптира към стойностите от друга част от светлинния диапазон постепенно, с помощта на така наречената адаптация, която лесно може да се опише като ситуация с изключване на осветлението в стая през нощта - в началото очите виждат много малко, но с течение на времето те се адаптират към променените условия на осветление и виждат много повече. Същото се случва и при смяна на тъмната среда обратно към светла.

Така че динамичният диапазон на модела за описание на RGB не е достатъчен, за да представи изображения, които човек може да види в действителност, този модел значително намалява възможните стойности на интензитета на светлината в горната и долната част на диапазона. Най-често срещаният пример, даден в HDR материал, е изображение на затъмнена стая с прозорец към светла улица в слънчев ден. С RGB модела можете да получите или нормално показване на това, което е извън прозореца, или само това, което е вътре в стаята. Стойностите по-големи от 100 cd/m 2 обикновено се изрязват в LDR, което е причината да е трудно правилно да се изобразят ярки източници на светлина директно в камерата при 3D изобразяване.

Досега самите устройства за показване на данни не могат да бъдат сериозно подобрени, но има смисъл да се откаже от LDR в изчисленията, можете да използвате реални физически стойности на интензитета и цвета (или линейно пропорционални) и да показвате максимума, който той може на монитора. Същността на HDR представянето е да се използват стойности на интензитета и цвета в реални физически величини или линейно пропорционални и да се използват не цели числа, а числа с плаваща запетая с висока точност (например 16 или 32 бита). Това ще премахне ограниченията на RGB модела, а динамичният диапазон на изображението ще се увеличи значително. Но тогава всяко HDR изображение може да бъде показано на всеки дисплей (същият RGB монитор), с възможно най-високо качество за него, като се използват специални алгоритми.

HDR изобразяването ни позволява да променим експозицията, след като изобразим изображението. Позволява ви да симулирате ефекта от адаптацията на човешкото зрение (преминаване от светли открити пространства към тъмни стаи и обратно), позволява ви да изпълнявате физически правилно осветление, а също така е унифицирано решение за прилагане на ефекти за последваща обработка (отблясъци, отблясъци, цъфтеж, замъгляване при движение). Алгоритмите за обработка на изображения, корекция на цветовете, гама корекция, размазване при движение, разцвет и други методи за последваща обработка се изпълняват по-добре в HDR представяне.

Приложенията за 3D рендиране в реално време (най-вече игри) започнаха да използват HDR изобразяване не толкова отдавна, защото изисква изчисления и поддръжка на целта във формати с плаваща запетая, които за първи път станаха достъпни само на видеочипове с поддръжка на DirectX 9 . Обичайният път на HDR изобразяване в игри като изобразяване на сцена в буфер с плаваща запетая, последваща обработка на изображение в разширен цветови диапазон (промяна на контраста и яркостта, цветовия баланс, ефекти на отблясъци и замъгляване при движение, отблясъци на обектива и други подобни) , използвайки тонално съпоставяне за показване на крайното HDR изображение на LDR дисплейно устройство. Понякога картите на средата се използват в HDR формати за статични отражения върху обекти, използването на HDR при симулиране на динамични пречупвания и отражения е много интересно, за това могат да се използват и динамични карти във формати с плаваща запетая. Към това можете да добавите още светлинни карти (светлинни карти), предварително изчислени и запазени в HDR формат. Голяма част от горното е направено например в Half-Life 2: Lost Coast.

HDR изобразяването е много полезно за сложна, по-висококачествена последваща обработка от конвенционалните методи. Същият цъфтеж ще изглежда по-реалистичен, когато се изчисли в модела за представяне на HDR. Например, както е направено в играта Far Cry на Crytek, тя използва стандартни техники за HDR изобразяване: филтри за разцвет, въведени от Kawase и оператор за тонално картографиране Reinhard.

За съжаление, в някои случаи разработчиците на игри могат да скрият под името HDR само филтър за разцвет, изчислен в обичайния диапазон на LDR. И докато повечето от това, което се прави в игрите с HDR изобразяване в момента, е цъфтеж с по-добро качество, предимствата на HDR изобразяването не се ограничават до този един постефект, а просто е най-лесният за изпълнение.

Други примери за използване на HDR изобразяване в приложения в реално време:


Преобразуването на тоновете е процесът на преобразуване на диапазона на HDR яркостта в диапазона на LDR, показван от изходно устройство като монитор или принтер, тъй като извеждането на HDR изображения към тях би изисквало динамичният обхват и гамата на HDR модела да бъдат преобразувани в съответния LDR динамичен диапазон, най-често моделът RGB. В крайна сметка обхватът на яркостта, представен в HDR, е много широк, той е няколко порядъка на абсолютния динамичен диапазон наведнъж, в една сцена. А диапазонът, който може да бъде възпроизведен на познати изходни устройства (монитори, телевизори), е само около два порядъка на динамичен диапазон.

Преобразуването от HDR в LDR се нарича тонално картографиране, то е със загуба и имитира свойствата на човешкото зрение. Такива алгоритми обикновено се наричат ​​оператори за тонално съпоставяне. Операторите разделят всички стойности на яркостта на изображението на три различни типа: тъмен, среден и светъл. Въз основа на оценката на осветеността на средния тон, цялостната осветеност се коригира, стойностите на яркостта на пикселите на сцената се преразпределят, за да се поберат в изходния диапазон, тъмните пиксели се осветяват, а светлите пиксели се потъмняват. След това най-ярките пиксели в изображението се мащабират до обхвата на изходното устройство или модела на изходния изглед. Следната снимка показва най-простото преобразуване на HDR изображение в LDR диапазона, линейна трансформация и по-сложен оператор за тонално картографиране се прилага към фрагмента в центъра, който работи, както е описано по-горе:

Вижда се, че само с използването на нелинейно тонално картографиране можете да получите максималните детайли в изображението и ако пренесете HDR в LDR линейно, тогава много малки неща просто се губят. Няма единен правилен алгоритъм за тонално картографиране, има няколко оператора, които дават добри резултати в различни ситуации. Ето нагледен пример за два различни оператора за тонално съпоставяне:

Заедно с HDR изобразяването, напоследък тоналното картографиране се използва в игрите. Стана възможно по избор да се имитират свойствата на човешкото зрение: загуба на острота в тъмни сцени, адаптиране към нови условия на осветление при преминаване от много ярки зони към тъмни и обратно, чувствителност към промени в контраста, цвета ... Ето как изглежда имитацията на способността на зрението да се адаптира в Far Cry. Първата екранна снимка показва изображението, което играчът вижда, когато току-що се е превърнал от тъмна стая в ярко осветено открито пространство, а вторият показва същото изображение след няколко секунди, след адаптация.

Блум

Bloom е един от кинематографичните ефекти за последваща обработка, който прави най-ярките части на изображението още по-ярки. Това е ефектът на много ярка светлина, която се проявява под формата на сияние около светли повърхности, след прилагане на филтъра за разцветяване, такива повърхности не само получават допълнителна яркост, светлината от тях (ореол) засяга частично и по-тъмните зони в съседство към светли повърхности в рамката. Най-лесният начин да покажете това е с пример:

В 3D Bloom графиката филтърът се прави с помощта на допълнителна последваща обработка - смесване на кадъра, намазан с филтъра за размазване (целият кадър или отделните му светли зони, филтърът обикновено се прилага няколко пъти) и оригиналния кадър. Един от най-често използваните в игри и други приложения в реално време е алгоритъмът за цъфтеж след филтриране:

  • Сцената се изобразява в фреймбуфера, интензитетът на сиянието (светенето) на обектите се записва в алфа канала на буфера.
  • Фреймбуферът се копира в специална текстура за обработка.
  • Разделителната способност на текстурата е намалена, например, с коефициент 4.
  • Филтрите за изглаждане (размазване) се прилагат към изображението няколко пъти въз основа на данните за интензитета, записани в алфа канала.
  • Полученото изображение се смесва с оригиналния кадър в фреймбуфера и резултатът се показва на екрана.

Подобно на други видове последваща обработка, bloom се използва най-добре при изобразяване във висок динамичен диапазон (HDR). Допълнителни примери за обработка на окончателното изображение на цъфтеж с филтър от 3D приложения в реално време:

замъгляване при движение

Замъгляването на движението се появява при фотография и заснемане поради движението на обекти в кадъра по време на експозицията на кадъра, докато затворът на обектива е отворен. Кадърът, заснет от камерата (снимка, филм), не показва моментната снимка, направена незабавно, с нулева продължителност. Поради технологични ограничения рамката показва определен период от време, през който обектите в кадъра могат да се движат на определено разстояние и ако това се случи, тогава всички позиции на движещия се обект през времето, когато затворът на обектива е отворен, ще бъдат представено върху кадъра като замъглено изображение по вектора на движение. Това се случва, ако обектът се движи спрямо камерата или камерата спрямо обекта и количеството размазване ни дава представа колко бързо се движи обектът.

В 3D анимацията във всеки конкретен момент от време (кадър) обектите се намират в определени координати в 3D пространство, подобно на виртуална камера с безкрайно бърза скорост на затвора. В резултат на това няма размазване като това, което изпитват камерата и човешкото око при гледане на бързо движещи се обекти. Изглежда неестествено и нереалистично. Помислете за прост пример: няколко сфери се въртят около определена ос. Ето изображение на това как би изглеждало това движение със и без замъгляване:

Не можете дори да разберете от изображение без размазване дали сферите се движат или не, докато размазването при движение дава ясна представа за скоростта и посоката на движение на обектите. Между другото, липсата на размазване на движението също е причината, поради която движението в игрите при 25-30 кадъра в секунда изглежда рязко, въпреки че филмите и видеото със същата честота на кадрите изглеждат страхотно. За да се компенсира липсата на замъгляване при движение, е желателна или висока честота на кадрите (60 кадъра в секунда или по-висока), или използването на допълнителни техники за обработка на изображения за емулиране на ефекта на размазване при движение. Това се използва както за подобряване на плавността на анимацията, така и за ефекта на фото и филмов реализъм едновременно.

Най-простият алгоритъм за размазване при движение за приложения в реално време е да се използва текущата рамка от данни за изобразяване от предишни кадри на анимацията. Но има по-ефективни и модерни методи за размазване при движение, които не използват предишни кадри, а се основават на векторите на движение на обекти в кадъра, като също така добавят само още една стъпка след обработка към процеса на изобразяване. Ефектът на размазване може да бъде или на цял екран (обикновено се прави при последваща обработка), или за отделни, най-бързо движещи се обекти.

Възможни приложения на ефекта на размазване при движение в игрите: всички състезателни игри (за създаване на ефект на много висока скорост и за използване при гледане на повторения, подобни на телевизия), спортни игри (същите повторения, но в самата игра, размазването може да бъде прилага се към много бързо движещи се обекти, като топка или шайба), бойни игри (бързи движения на оръжия за меле, ръце и крака), много други игри (по време на 3D кътсцени в играта на двигателя). Ето няколко примера за прилагане на постефект на замъгляване на движение от игри:

дълбочина на полето (DOF)

Дълбочината на полето (дълбочината на полето), накратко, е замъгляването на обектите в зависимост от позицията им спрямо фокуса на камерата. В реалния живот, на снимки и във филми, ние не виждаме всички обекти еднакво ясно, това се дължи на особеността на структурата на окото и дизайна на оптиката на фото и филмови камери. Фото и филмовата оптика имат определено разстояние, обектите, разположени на такова разстояние от камерата, са на фокус и изглеждат остри в картината, докато обектите, по-отдалечени от камерата или по-близо до нея, напротив, изглеждат замъглени, остротата намалява постепенно с увеличаване или намаляване на разстоянието.

Както се досещате, това е снимка, а не рендеринг. В компютърната графика, от друга страна, всеки обект от изобразеното изображение е напълно ясен, тъй като лещите и оптиката не се симулират при изчисленията. Следователно, за да се постигне фото и филмов реализъм, трябва да се прилагат специални алгоритми, за да се направи нещо подобно за компютърната графика. Тези техники симулират ефекта на различен фокус върху обекти на различни разстояния.

Една често срещана техника при изобразяването в реално време е смесването на оригиналния кадър и неговата замъглена версия (няколко преминавания на филтъра за размазване) въз основа на данните за дълбочината на пикселите в изображението. В игрите има няколко употреби на ефекта DOF, като клипове за игри в двигателя на играта, повторения в спортни и състезателни игри. Примери за дълбочина на полето в реално време:

Ниво на детайлност (LOD)

Ниво на детайлност (ниво на детайлност) в 3D приложения е метод за намаляване на сложността на изобразяването на рамка, намаляване на общия брой полигони, текстури и други ресурси в сцената, цялостното намаляване на нейната сложност. Прост пример: моделът на главния герой се състои от 10 000 полигона. В случаите, когато се намира близо до камерата в обработената сцена, е важно да се използват всички полигони, но на много голямо разстояние от камерата в крайното изображение ще заема само няколко пиксела и няма точка при обработка на всички 10 000 полигона. Може би в този случай ще са достатъчни стотици полигони или дори няколко парчета и специално подготвена текстура за приблизително същия дисплей на модела. Съответно, на средни разстояния има смисъл да се използва модел, състоящ се от брой триъгълници, по-голям от този на най-простия модел и по-малък от този на най-сложния.

Методът LOD обикновено се използва при моделиране и изобразяване на 3D сцени, като се използват няколко нива на сложност (геометрични или други) за обекти пропорционално на разстоянието им от камерата. Методът често се използва от разработчиците на игри за намаляване на броя на полигоните в сцена и за подобряване на производителността. Когато са близо до камерата, моделите с максимални детайли (брой триъгълници, размер на текстурата, сложност на текстурата) се използват за възможно най-високо качество на изображението и обратно, когато моделите са по-далеч от камерата, моделите с по-малко триъгълници се използват за увеличаване на скоростта на изобразяване. Промяната на сложността, по-специално броя на триъгълниците в модела, може да се извърши автоматично въз основа на един 3D модел с максимална сложност или може би въз основа на няколко предварително подготвени модела с различни нива на детайлност. Чрез използване на модели с по-малко детайли за различни разстояния, изчислената сложност на изобразяването се намалява, без почти никакво влошаване на общите детайли на изображението.

Методът е особено ефективен, ако броят на обектите в сцената е голям и те са разположени на различни разстояния от камерата. Например, да вземем спортна игра, като симулатор на хокей или футбол. Моделите на герои с нисък полигон се използват, когато са далеч от камерата, а когато се доближат, моделите се заменят с други с голям брой полигони. Този пример е много прост и показва същността на метода, базиран на две нива на детайлност на модела, но никой не си прави труда да създаде няколко нива на детайлност, така че ефектът от промяната на нивото на LOD да не е твърде забележим, така че детайлите постепенно "нарастват" с приближаването на обекта.

Освен разстоянието от камерата, други фактори също могат да имат значение за LOD - общият брой обекти на екрана (когато има един или два знака в кадъра, тогава се използват сложни модели, а когато са 10-20, те превключете към по-прости) или броя на кадрите в секунда (задават се граници на стойностите на FPS, при които нивото на детайлност се променя, например при FPS под 30 намаляваме сложността на моделите на екрана, а при 60 , напротив, увеличаваме го). Други възможни фактори, влияещи върху нивото на детайлност, са скоростта на движение на обект (едва ли ще имате време да видите ракета в движение, но охлюв е лесен), важността на героя от гледна точка на играта (вземете същия футбол - за модела на играча, който управлявате, можете да използвате по-сложна геометрия и текстури, виждате го най-близо и най-често). Всичко зависи от желанията и възможностите на конкретен разработчик. Основното нещо е да не прекалявате, честите и забележими промени в нивото на детайлност са досадни.

Нека ви напомня, че нивото на детайлност не се отнася непременно само за геометрията, методът може да се използва и за спестяване на други ресурси: при текстуриране (въпреки че видеочиповете вече използват mipmapping, понякога има смисъл да променяте текстурите в движение на други с различни детайли), осветителни техники (подобни обекти се осветяват по сложен алгоритъм, а отдалечените - по прост), техника на текстуриране (на близки повърхности се използва сложно паралаксно картиране, а на далечни повърхности се използва нормално картографиране) , и т.н.

Не е толкова лесно да се покаже пример от играта, от една страна, LOD се използва до известна степен в почти всяка игра, от друга страна, не винаги е възможно това да се покаже ясно, в противен случай няма да има смисъл в самия LOD.

Но в този пример все още е ясно, че най-близкият модел кола има максимална детайлност, следващите две или три коли също са много близо до това ниво, а всички далечни имат видими опростения, ето само най-значимите: има няма огледала за обратно виждане, регистрационни номера, чистачки и допълнително осветление. И от най-далечния модел няма дори сянка на пътя. Това е нивото на детайлност на алгоритъма в действие.

глобално осветление

Реалистичното осветление на сцената е трудно за симулиране, всеки лъч светлина в реалността се отразява и пречупва многократно, броят на тези отражения не е ограничен. А при 3D изобразяване броят на отраженията е силно зависим от възможностите за изчисление, всяко изчисление на сцената е опростен физически модел и полученото изображение е само близо до реализъм.

Алгоритмите за осветление могат да бъдат разделени на два модела: директно или локално осветление и глобално осветление (директно или локално осветление и глобално осветление). Моделът за локално осветление използва изчисляването на директно осветяване, светлина от източници на светлина до първото пресичане на светлината с непрозрачна повърхност, взаимодействието на обектите един с друг не се взема предвид. Въпреки че този модел се опитва да компенсира това чрез добавяне на фоново или околно осветление, това е най-простото приближение, силно опростено осветление от всички индиректни източници на светлина, което задава цвета и интензитета на осветяване на обекти при липса на директни източници на светлина.

Същото трасиране на лъчите изчислява осветяването на повърхности само от директни лъчи от източници на светлина и всяка повърхност, за да бъде видима, трябва да бъде директно осветена от източник на светлина. Това не е достатъчно за постигане на фотореалистични резултати, освен директното осветяване трябва да се вземе предвид и вторичното осветяване от лъчи, отразени от други повърхности. В реалния свят светлинните лъчи се отбиват от повърхностите няколко пъти, докато изчезнат напълно. Слънчевата светлина, преминаваща през прозорец, осветява цялата стая, въпреки че лъчите не могат директно да достигнат до всички повърхности. Колкото по-ярък е източникът на светлина, толкова повече пъти ще отскача. Цветът на отразяващата повърхност също влияе върху цвета на отразената светлина, например червена стена ще предизвика червено петно ​​върху съседен бял обект. Ето ясна разлика, изчисление без да се вземе предвид вторичното осветление и да се вземе предвид:

В глобалния модел на осветеност, глобалното осветление, осветеността се изчислява, като се вземе предвид влиянието на обектите един върху друг, отчитат се многократни отражения и пречупвания на светлинни лъчи от повърхностите на обекти, каустик и подповърхностно разсейване. Този модел ви позволява да получите по-реалистична картина, но усложнява процеса, изисквайки значително повече ресурси. Има няколко алгоритма за глобално осветяване, ще разгледаме накратко радиусите (изчисляване на индиректното осветяване) и фотонното картографиране (изчисляване на глобалната осветеност на базата на фотонни карти, предварително изчислени с помощта на трасиране). Съществуват и опростени методи за симулиране на индиректно осветление, като например промяна на общата яркост на сцената в зависимост от броя и яркостта на светлините в нея или използване на голям брой точкови светлини, поставени около сцената, за да се симулира отразена светлина, но все пак това е далеч от истински алгоритъм. G.I.

Алгоритъмът за радиация е процесът на изчисляване на вторичните отражения на светлинните лъчи от една повърхност към друга, както и от околната среда към обекти. Лъчите от източници на светлина се проследяват, докато силата им не падне под определено ниво или лъчите достигнат определен брой отражения. Това е често срещана GI техника, изчисленията обикновено се правят преди изобразяване и резултатите от изчислението могат да се използват за изобразяване в реално време. Основните идеи за радиация се основават на физиката на топлопреминаването. Повърхностите на обектите са разделени на малки зони, наречени петна, и се приема, че отразената светлина се разпръсква равномерно във всички посоки. Вместо да се изчислява всеки лъч за светлините, се използва техника на усредняване, разделяща светлините на петна въз основа на енергийните нива, които изхвърлят. Тази енергия се разпределя между петна от повърхности пропорционално.

Друг метод за изчисляване на глобалната осветеност, предложен от Хенрик Уон Дженсен, е методът на фотонно картографиране. Използването на фотонни карти е друг алгоритъм за глобално осветление, базиран на проследяване на лъчи, използван за симулиране на взаимодействието на светлинни лъчи с обекти на сцената. Алгоритъмът изчислява вторични отражения на лъчи, пречупване на светлината през прозрачни повърхности, дифузни отражения. Този метод се състои в изчисляване на осветеността на точките на повърхността на два прохода. Първият извършва директно трасиране на лъчи на светлина с вторични отражения, това е предварителен процес, извършен преди основното рендиране. Този метод изчислява енергията на фотоните, пътуващи от източника на светлина към обектите в сцената. Когато фотоните достигнат повърхността, пресечната точка, посоката и енергията на фотона се съхраняват в кеш, наречен фотонна карта. Фотонните карти могат да бъдат записани на диск за по-късна употреба, без да се налага да ги преизчислявате на всеки кадър. Фотонните отражения се изчисляват, докато работата спре след определен брой отражения или когато се достигне определена енергия. При втория проход на изобразяване се изчислява осветеността на пикселите на сцената от директни лъчи, като се вземат предвид данните, съхранявани във фотонните карти, енергията на фотона се добавя към енергията на директното осветяване.

Изчисленията на глобалното осветление, които използват голям брой вторични отражения, отнемат много повече време от изчисленията на директното осветление. Има техники за хардуерно изчисляване на радиопространството в реално време, които използват възможностите на последното поколение програмируеми видеочипове, но засега сцените, за които се изчислява глобалното осветление в реално време, трябва да са доста прости и се правят много опростявания в алгоритмите.

Но това, което се използва от дълго време, е статично предварително изчислено глобално осветление, което е приемливо за сцени без промяна на позицията на източниците на светлина и големите обекти, които силно влияят на осветлението. В крайна сметка изчисляването на глобалната осветеност не зависи от позицията на наблюдателя и ако позицията на такива обекти на сцената и параметрите на източниците на светлина не се променят в сцената, тогава могат да се използват предварително изчислени стойности на осветеност. Това се използва в много игри чрез съхраняване на данни за изчисление на ГИ под формата на светлинни карти (lightmaps).

Съществуват и приемливи алгоритми за симулиране на глобално осветление в динамика. Например, има този прост метод за използване в приложения в реално време за изчисляване на индиректното осветяване на обект в сцена: опростено изобразяване на всички обекти с намалена детайлност (с изключение на този, за който се разглежда осветлението), до кубична карта с ниска разделителна способност (може да се използва и за показване на динамични отражения върху повърхността на обекта), след това филтриране на тази текстура (няколко преминавания на филтъра за размазване) и осветяване на този обект с данни от изчислената текстура като допълнение към директното осветление. В случаите, когато динамичното изчисление е твърде тежко, могат да се откажат от статичните карти на радиация. Пример от играта MotoGP 2, който ясно показва полезните ефекти дори от такава проста имитация на GI:



"itemprop="image">

„Какво са шейдърите?“ е много често срещан въпрос на любопитни играчи и начинаещи разработчици на игри. В тази статия ще ви разкажа разбираемо и ясно за тези ужасни шейдъри.

Смятам, че компютърните игри са двигател на прогреса към фотореалистични изображения в компютърната графика, така че нека да поговорим какво представляват „шейдърите“ в контекста на видеоигрите.

Преди първите графични ускорители цялата работа по изобразяването на кадри за видеоигри се извършваше от лошия процесор.

Рисуването на рамка всъщност е доста скучна работа: трябва да вземете "геометрията" - полигонални модели (свят, герои, оръжия и т.н.) и да я растеризирате. Какво е растеризиране? Целият 3d модел се състои от най-малките триъгълници, които растеризаторът превръща в пиксели (тоест „растеризиране“ означава превръщане в пиксели). След растеризация вземете данни за текстура, параметри на осветление, мъгла и т.н. и изчислете всеки получен пиксел от рамката на играта, който ще бъде показан на играча.

Така че централният процесор (CPU - Central Processing Unit) е твърде умен човек, за да го принуди да прави такава рутина. Вместо това е логично да се отдели някакъв хардуерен модул, който ще разтовари процесора, за да може той да върши по-важна интелектуална работа.

Такъв хардуерен модул се превърна в графичен ускорител или видеокарта (GPU - Graphics Processing Unit). Сега процесорът подготвя данните и натоварва колега с рутинна работа. Като се има предвид, че GPU вече не е само един колега, той е тълпа от миньони-ядра, той се справя с такава работа наведнъж.

Но все още не сме получили отговор на основния въпрос: Какво представляват шейдърите? Чакай, стигам до това.

Добрата, интересна и близка до фотореализма графика изисква от разработчиците на видеокарти да имплементират много алгоритми на хардуерно ниво. Сенки, светлини, акценти и така нататък. Този подход - с внедряването на алгоритми в хардуера се нарича "Fixed pipeline or pipeline" и там, където се изисква висококачествена графика, той вече не се намира. Неговото място беше заето от Programmable Pipeline.

Молби от играчите „Хайде, внесете добър графоний! Изненада!", тласна разработчиците на игри (и съответно производителите на видеокарти) към все по-сложни алгоритми. Досега в един момент хардуерните алгоритми станаха твърде малко за тях.

Време е графичните карти да станат по-интелигентни. Решението беше взето да позволи на разработчиците да програмират GPU блокове в произволни тръбопроводи, които реализират различни алгоритми. Тоест разработчиците на игри, графичните програмисти вече можеха да пишат програми за видеокарти.

И сега най-накрая стигнахме до отговора на нашия основен въпрос.

„Какво са шейдърите?“

Shader (на английски shader - програма за засенчване) е програма за видеокарта, която се използва в триизмерни графики за определяне на крайните параметри на обект или изображение, може да включва описание на поглъщането и разсейването на светлината, текстурно картиране, отражение и пречупване, засенчване, изместване на повърхността и много други опции.

Какво представляват шейдърите? Например, ето ефект, който можете да получите, това е воден шейдър, приложен върху сфера.

Графичен конвейер

Предимството на програмируемия конвейер пред неговия предшественик е, че сега програмистите могат да създават свои собствени алгоритми сами, вместо да използват хардуерно набор от опции.

Първоначално видеокартите бяха оборудвани с няколко специализирани процесора, които поддържаха различни набори от инструкции. Шейдърите бяха разделени на три типа в зависимост от това кой процесор ще ги изпълнява. Но след това видеокартите започнаха да бъдат оборудвани с универсални процесори, които поддържат набори от инструкции и на трите типа шейдъри. Разделението на шейдърите на типове е запазено, за да се опише целта на шейдъра.

В допълнение към графичните задачи с такива интелигентни графични карти, стана възможно извършването на изчисления с общо предназначение (не-компютърна графика) на GPU.

За първи път пълна поддръжка за шейдъри се появи във видеокартите от серията GeForce 3, но рудиментите бяха внедрени още в GeForce256 (под формата на Register Combiners).

Видове шейдъри

В зависимост от етапа на конвейера, шейдърите са разделени на няколко типа: върхови, фрагментни (пикселни) и геометрични. А в най-новите видове конвейери има и теселационни шейдъри. Няма да обсъждаме подробно графичния конвейер, все още мисля да напиша отделна статия за това, за тези, които решат да изучават шейдъри и графично програмиране. Пишете в коментарите, ако се интересувате, ще знам дали си струва да губим време.

Вертекс шейдър

Вертексните шейдъри правят анимации на герои, трева, дървета, създават вълни върху водата и много други неща. Във върховия шейдър програмистът има достъп до данни, свързани с върхове, например: координатите на върха в пространството, неговите текстурни координати, неговия цвят и нормален вектор.

Геометричен шейдър

Геометричните шейдъри са способни да създават нова геометрия и могат да се използват за създаване на частици, модифициране на детайлите на модела в движение, създаване на силуети и др. За разлика от предишния връх, те са в състояние да обработват не само един връх, но и целия примитив. Примитивът може да бъде сегмент (два върха) и триъгълник (три върха) и ако има информация за съседни върхове (на английски adjacency), до шест върха могат да бъдат обработени за триъгълен примитив.

Пикселен шейдър

Пикселните шейдъри изпълняват текстурно картографиране, осветление и различни текстурни ефекти като отражение, пречупване, мъгла, картографиране на удари и т.н. Пикселните шейдъри се използват и за постефекти.

Пикселният шейдър работи с фрагменти от растерни изображения и с текстури - обработва данните, свързани с пикселите (напр. цвят, дълбочина, текстурни координати). Пикселният шейдър се използва на последния етап от графичния конвейер за формиране на фрагмент от изображението.

На какво пишат шейдърите?

Първоначално шейдърите можеха да бъдат написани на език, подобен на асемблер, но по-късно се появиха шейдърни езици от високо ниво, подобни на C, като Cg, GLSL и HLSL.

Такива езици са много по-прости от C, тъй като задачите, решени с тяхна помощ, са много по-прости. Типовата система на такива езици отразява нуждите на графичните програмисти. Следователно те предоставят на програмиста специални типове данни: матрици, семплери, вектори и т.н.

RenderMan

Всичко, което обсъдихме по-горе, се отнася за графиките в реално време. Но има графики, които не са в реално време. Каква е разликата - реално време - реално време, тоест тук и сега - да дадете 60 кадъра в секунда в играта, това е процес в реално време. Но изобразяването на сложен кадър за авангардна анимация за няколко минути не е в реално време. Въпросът е във времето.

Например графики с такова качество като в най-новите анимационни филми на Pixar сега не могат да бъдат получени в реално време. Много големи ферми за рендеринг изчисляват симулации на светлина, използвайки напълно различни алгоритми, много скъпи, но даващи почти фотореалистични изображения.

Супер реалистична графика в Sand Piper

Например, вижте тази сладка карикатура, пясъчни зърна, птичи пера, вълни, всичко изглежда невероятно реално.

*Видеото може да бъде забранено в Youtube, ако не се отвори, google pixar sandpiper - кратка карикатура за смел sandpiper е много сладка и пухкава. Докосва и демонстрира колко готина може да бъде компютърната графика.

Така че това е RenderMan от Pixar. Той стана първият език за програмиране на шейдъри. RenderMan API е де факто стандартът за професионално изобразяване, използван от всички студия на Pixar и извън тях.

Полезна информация

Сега знаете какво представляват шейдърите, но освен шейдърите, има и други много интересни теми в разработването на игри и компютърната графика, които със сигурност ще ви заинтригуват:

  • , е техника за създаване на зашеметяващи ефекти в съвременните видеоигри. Обзорна статия и видео с уроци за създаване на ефекти в Unity3d
  • - Ако мислите да развивате видеоигри като професионална кариера или като хоби, тази статия съдържа страхотен набор от препоръки откъде да започнете, какви книги да четете и т.н.

Ако има някакви въпроси

Както обикновено, ако имате въпроси, задайте ги в коментарите, винаги ще отговоря. За всяка любезна дума или поправка на грешки ще съм много благодарен.

Този урок ще ви помогне да инсталирате шейдъри в Minecraft и по този начин да подобрите света на играта чрез добавяне на динамични сенки, шум от вятър и трева, реалистична вода и много други.

Веднага трябва да се отбележи, че шейдърите натоварват системата доста силно и ако имате слаба видеокарта или дори интегрирана, препоръчваме ви да се въздържате от инсталиране на този мод.

Инсталацията се състои от два етапа, първо трябва да инсталирате мода за шейдъри и след това допълнителни пакети за шейдъри към него

СТЪПКА #1 - Инсталиране на мода за шейдъри

  1. Изтеглете и инсталирайте Java
  2. Инсталирай OptiFine HD
    или ShaderMod;
  3. Разопаковайте получения архив на всяко място;
  4. Стартираме jar файла, т.к той е монтажник;
  5. Програмата ще ви покаже пътя към играта, ако всичко е правилно, щракнете върху Да, OK, OK;
  6. Отидете на .minecraftи създайте папка там shaderpacks;
  7. Отиваме в стартовия панел и виждаме в реда нов профил с името "ShadersMod", ако не, тогава го изберете ръчно.
  8. След това трябва да изтеглите пакети за шейдъри

СТЪПКА #2 - Инсталирайте shaderpack

  1. Изтеглете Shaderpack, който ви интересува (списък в края на статията)
  2. Натиснете клавишите Win+R
  3. Отидете на .minecraft/shaderpacks. Ако няма такава папка, тогава я създайте.
  4. Преместете или извлечете архива на шейдъра в .minecraft/shaderpacks. Пътят трябва да изглежда така: .minecraft/shaderpacks/SHADER_FOLDER_NAME/shaders/[.fsh и .vsh файлове вътре]
  5. Стартирайте Minecraft и тръгвайте Настройки > Шейдъри. Тук ще видите списък с наличните шейдъри. Изберете този, който искате
  6. В настройките на шейдъра активирайте "tweakBlockDamage", деактивирайте "CloudShadow" и "OldLighting"

Невероятните шейдъри на Sonic Ether
Шейдърите на Sildur
Шейдери на Chocapic13
yShaders на sensi277
Шейдери на MrMeep_x3
Cel Shaders на Naelego
Шейдери на RRe36
CUDA шейдърите на DeDelner
Киселинни шейдъри на bruceatsr44
Шейдери на Beed28
Shader Pack на Ziipzaap
Шейдърите на robobo1221
Шейдери на dvv16
Stazza85 супер шейдъри
Пакет шейдъри на hoo00 B
Вълшебни растения на Regi24
MrButternuss ShaderPack
Страхотната графика на DethRaid върху нитро шейдъри
Shader на Edi за ALLPc
TME шейдъри на CrankerMan
Kadir Nck Shader (за skate702)
Шейдери на Werrus
Shaders Life Nexus на Knewtonwako
Пакет за шейдъри CYBOX
CrapDeShoes CloudShade Alpha
AirLoocke42 шейдър
BSL шейдъри на CaptTatsu
Shaders на Triliton
ShadersMcOfficial's Bloominx Shaders (Chocapic13" шейдъри)
Continuum Shaders на dotModded
Лунни шейдъри на Qwqx71 (шейдър на chocapic13)

Предназначен за изпълнение от процесори на видеокарти (GPU). Шейдърите се компилират на един от специализираните езици за програмиране (вижте) и се компилират в инструкции за графичния процесор.

Приложение

Преди използването на шейдъри се използваше процедурно генериране на текстури (например, използвано в Unreal за създаване на анимирани текстури на вода и огън) и мултитекстуриране (езиците на шейдърите, използвани в Quake 3, се основаваше на него). Тези механизми не осигуряват същата гъвкавост като шейдърите.

С появата на преконфигурируеми графични конвейери стана възможно да се извършват математически изчисления на GPU (GPGPU). Най-известните GPGPU двигатели са nVidia CUDA, Microsoft DirectCompute и OpenCL с отворен код.

Типове шейдъри

Върхови шейдъри

Върховият шейдър работи с данни, свързани с върховете на полиедри, например с координатите на връх (точка) в пространството, с текстурни координати, с цвят на върха, с допирателен вектор, с бинормален вектор, с нормален вектор. Върховият шейдър може да се използва за изглед и трансформация в перспектива на върхове, за генериране на текстурни координати, за изчисляване на осветление и др.

Пример за код за шейдер на връх в:

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

Геометрични шейдъри

Геометричният шейдър, за разлика от шейдера за връх, може да обработва не само един връх, но и целия примитив. Примитивът може да бъде сегмент (два върха) и триъгълник (три върха) и ако има информация за съседни върхове (на английски adjacency), до шест върха могат да бъдат обработени за триъгълен примитив. Геометричният шейдър е способен да генерира примитиви в движение (без да използва процесора).

Геометричните шейдъри бяха използвани за първи път на графичните карти от серия 8 на Nvidia.

Пикселни (фрагментни) шейдъри

Пикселният шейдър работи с фрагменти от растерни изображения и с текстури - обработва данните, свързани с пикселите (напр. цвят, дълбочина, текстурни координати). Пикселният шейдър се използва на последния етап от графичния конвейер за формиране на фрагмент от изображението.

Примерен код за пикселен шейдър в:

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

Предимства и недостатъци

предимства:

  • възможността за компилиране на всякакви алгоритми (гъвкавост, опростяване и намаляване на цената на цикъла на разработка на програмата, увеличаване на сложността и реализма на изобразените сцени);
  • увеличаване на скоростта на изпълнение (в сравнение със скоростта на изпълнение на същия алгоритъм, изпълняван на централния процесор).

недостатъци:

  • необходимостта от изучаване на нов език за програмиране;
  • наличието на различни набори от инструкции за графични процесори от различни производители.

Програмни езици

За да отговори на различните нужди на пазара (компютърната графика има много приложения), са създадени голям брой езици за програмиране на шейдъри.

Обикновено езиците за писане на шейдъри предоставят на програмиста специални типове данни (матрици, семплери, вектори и т.н.), набор от вградени променливи и константи (за взаимодействие със стандартната функционалност на 3D API).

Професионално изобразяване

Следват езици за програмиране на шейдъри, които са фокусирани върху постигане на максимално качество на изобразяване. В такива езици свойствата на материалите се описват с помощта на абстракции. Това позволява на хора, които нямат специални умения за програмиране и не познават характеристиките на хардуерните реализации, да пишат код. Например, художниците могат да напишат такива шейдъри, за да осигурят "правилния вид" (картографиране на текстури, поставяне на светлина и т.н.).

Обикновено обработката на такива шейдъри е доста ресурсоемка: създаването на фотореалистични изображения изисква много изчислителна мощност. Обикновено по-голямата част от изчисленията се извършват от големи компютърни клъстери или блейд системи.

RenderMan Езикът за програмиране на шейдъри, внедрен в софтуера RenderMan на Pixar, беше първият език за програмиране на шейдъри. RenderMan API, разработен от Роб Кук и описан в спецификацията на интерфейса на RenderMan, е де факто стандартът за професионално изобразяване, използван в работата на Pixar. OSL OSL Open Shading Language е език за програмиране на шейдъри, разработен от Sony Pictures Imageworksи напомнящ език. Използва се в собствената програма Arnold, разработена от Sony Pictures Imageworks за рендиране, и в безплатната програма Blender за създаване на триизмерна компютърна графика. Изобразяване в реално време GLSL GLSL Отвореното GL Спритежаване Лъгъл) е език за програмиране на шейдъри, описан в стандарта OpenGL и базиран на версията на езика, описана в стандарта ANSI C. Езикът поддържа повечето от функциите на ANSI C, поддържа типове данни, които често се използват при работа с триизмерни графики (вектори, матрици). Думата "шейдър" в GLSL се отнася до независимо компилиран модул, написан на този език. Думата "програма" се отнася до набор от компилирани шейдъри, свързани заедно. cg (английски) ° Сза жрафика) е език за програмиране на шейдъри, разработен от nVidia в сътрудничество с Microsoft. Езикът е подобен на езика и езика HLSL, разработен от Microsoft и включен в DirectX 9. Езикът използва типовете "int", "float", "half" (число с плаваща запетая с размер 16 бита). Езикът поддържа функции и структури. Езикът има особени оптимизации под формата на "опаковани масиви" (