Що таке Шейдери? Просто про складне для початківців. Як встановити шейдери на Майнкрафт? Як використовувати шейдери

Призначена для виконання процесорами відеокарти (GPU). Шейдери складаються однією зі спеціалізованих мов програмування (див. ) і компілюються в інструкції для 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) для трикутного примітиву може бути оброблено до шести вершин. Геометричний шейдер здатний генерувати примітиви "на льоту" (не задіявши при цьому центральний процесор).

Геометричні шейдери вперше почали використовувати на відеокартах Nvidia серії 8.

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

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

Приклад коду для піксельного шейдера мовою:

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

Достоїнства і недоліки

Переваги:

  • можливість складання будь-яких алгоритмів (гнучкість, спрощення та здешевлення циклу розробки програми, підвищення складності та реалістичності сцен, що візуалізуються);
  • підвищення швидкості виконання (порівняно зі швидкістю виконання того ж алгоритму, що виконується на центральному процесорі).

Недоліки:

  • необхідність вивчення нової мови програмування;
  • Існування різних наборів інструкцій для GPU різних виробників.

Мови програмування

Для задоволення різних потреб ринку (комп'ютерна графіка має безліч сфер застосування) було створено велику кількість мов програмування шейдерів.

Зазвичай мови для написання шейдерів надають програмісту спеціальні типи даних (матриці, семплери, вектори та ін), набір вбудованих змінних і констант (для взаємодії зі стандартною функціональністю 3D API).

Професійний рендеринг

Далі перераховані мови програмування шейдерів, орієнтовані досягнення максимальної якості візуалізації. Такими мовами властивості матеріалів описуються за допомогою абстракцій. Це дозволяє писати код людям, які не мають особливих навичок програмування та не знають особливостей апаратних реалізацій. Наприклад, художники можуть писати такі шейдери з метою забезпечити «правильний вигляд» (накладення текстур, розташування джерел світла та ін.).

Зазвичай обробка таких шейдерів досить ресурсомістка: створення фотореалістичних зображень потребує великих обчислювальних потужностей. Зазвичай основна частина обчислень виконується великими комп'ютерними кластерами або блейд-системами.

RenderMan Мова програмування шейдерів, реалізована в ПЗ RenderMan фірми Pixar, стала першою мовою програмування шейдерів. API RenderMan розроблено Робом Куком та описано у специфікації інтерфейсу RenderMan, є фактичним стандартом для професійного рендерингу, використовується у всіх роботах студії Pixar. OSL OSL – англ. Open Shading Language - мова програмування шейдерів, розроблена фірмою Sony Pictures Imageworksі нагадує мову. Використовується в пропрієтарній програмі Arnold, розробленої фірмою Sony Pictures Imageworks і призначеної для рендерингу, і у вільній програмі Blender, призначеної для створення тривимірної комп'ютерної графіки. Рендеринг реального часу GLSL GLSL (англ. the Open GL S hading L anguage) - мова програмування шейдерів, описана в стандарті OpenGL і заснована на версії мови, описаної в стандарті ANSI C . Мова підтримує більшість можливостей ANSI C, підтримує типи даних, які часто застосовуються при роботі з тривимірною графікою (вектори, матриці). Словом «шейдер» у мові GLSL називається незалежно компилируемая одиниця, написана цією мовою. Словом "програма" називається набір скомпілованих шейдерів, пов'язаних разом. Cg (англ. C for g raphics) - мова програмування шейдерів, розроблений фірмою nVidia спільно з фірмою Microsoft. Мова схожа на мову і на мову HLSL, розроблена фірмою Microsoft і що входить до складу DirectX 9. У мові використовуються типи "int", "float", "half" (число з плаваючою комою розміром 16 біт). Мова підтримує функції та структури. Мова має своєрідні оптимізації у вигляді «упакованих масивів» (

"itemprop="image">

Що таке шейдери? - дуже часто питання цікавих гравців і початківців ігрових розробників. У цій статті зрозуміло про цих страшних шейдерів розповім.

Двигуном прогресу у бік фотореалістичності картинки в комп'ютерній графіці я вважаю саме комп'ютерні ігри, тому давайте саме у розрізі відео-ігор і поговоримо про те, що таке шейдери.

До того, як з'явилися перші графічні прискорювачі, всю роботу з відтворення кадрів відеоігри виконував бідолаха центральний процесор.

Відображення кадру, досить рутинна робота насправді: треба взяти «геометрію» — полігональні моделі (світ, персонаж, зброю тощо) та розтеризувати. Що таке розтеризувати? Вся 3d модель складається з найдрібніших трикутників, які розтеризатор перетворює на пікселі (тобто «розстеризувати» означає перетворити на пікселі). Після розтеризації взяти текстурні дані, параметри освітленості, туману і тп і розрахувати кожен результуючий піксель кадру, який буде виведений на екран гравцю.

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

Таким апаратним модулем став – графічний прискорювач або відеокарта (GPU – Graphics Processing Unit). Тепер CPU готує дані та завантажує рутинною роботою колегу. Зважаючи на те, що GPU зараз це не просто один колега, це натовп міньйонів-ядер, то він з такою роботою справляється на раз.

Але ми поки що не отримали відповіді на головне питання: Що таке шейдери? Чекайте, я підводжу до цього.

Хороша, цікава та близька до фото-реалізму графіка, вимагала від розробників відеокарт реалізовувати багато алгоритмів на апаратному рівні. Тіні, світло, відблиски тощо. Такий підхід — з реалізацією алгоритмів апаратно називається «Фіксований пайплайн чи конвеєр» і там, де потрібна якісна графіка, він тепер не зустрічається. Його місце посів «Програмований пайплайн».

Запити гравців «Давайте, завозіть хороший графоній! дивуйте!», штовхали розробників ігор (і виробників відеокарт відповідно) все до більш складних алгоритмів. Поки в якийсь момент зашитих апаратних алгоритмів їм замало.

Настав час відеокарт стати більш інтелектуальними. Було прийнято рішення дозволити розробникам програмувати блоки графічного процесора довільні конвеєри, що реалізують різні алгоритми. Тобто, розробники ігор, графічні програмісти відтепер змогли писати програми для відеокарток.

І ось нарешті ми дійшли до відповіді на наше головне питання.

Що таке шейдери?

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

Що таке Шейдер? Наприклад, такий ефект можна отримати, це шейдер води застосований до сфери.

Графічний пайплайн

Перевага програмованого конвеєра перед його попередником у тому, що тепер програмістам можна створювати свої алгоритми самостійно, а не користуватися зашитим апаратним набором опцій.

Спочатку відеокарти оснастили кількома спеціалізованими процесорами, які підтримують різні набори інструкцій. Шейдери ділили на три типи залежно від того, який процесор їх виконуватиме. Але потім відеокарти стали оснащувати універсальними процесорами, що підтримують набори вказівок всіх трьох типів шейдерів. Розподіл шейдерів на типи зберігся для опису призначення шейдера.

Крім графічних завдань із такими інтелектуальними відеокартами з'явилася можливість виконання на GPU обчислень загального призначення (не пов'язаних із комп'ютерною графікою).

Вперше повноцінна підтримка шейдерів з'явилася у відеокартах серії GeForce 3, але зачатки були реалізовані ще GeForce256 (у вигляді Register Combiners).

Види шейдерів

Залежно від стадії конвеєра шейдери діляться кілька типів: вершинний, фрагментний (піксельний) і геометричний. А в нових типах конвеєрів є ще шейдери тесселяції. Докладно обговорювати графічний конвеєр ми не будемо, я все думаю, чи не написати про це окрему статтю, для тих, хто вирішить зайнятися вивченням шейдерів та програмування графіки. Напишіть у коментарях якщо Вам цікаво, я знатиму, чи варто витрачати час.

Вершинний шейдер

Вершинними шейдерами роблять анімації персонажів, трави, дерев, створюють хвилі на воді та багато інших штук. У вершинному шейдері програмісту доступні дані, пов'язані з вершинами, наприклад: координати вершини в просторі, її текстурні координатами, її колір і вектор нормалі.

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

Геометричні шейдери здатні створювати нову геометрію і можуть використовуватися для створення частинок, зміни деталізації моделі «на льоту», створення силуетів тощо. На відміну від попереднього вершинного, здатні обробити як одну вершину, а й цілий примітив. Примітивом може бути відрізок (дві вершини) та трикутник (три вершини), а за наявності інформації про суміжні вершини (англ. adjacency) для трикутного примітиву може бути оброблено до шести вершин.

Піксельний шейдер

Піксельні шейдери виконують накладання текстур, освітлення, та різні текстурні ефекти, такі як відображення, заломлення, туман, Bump Mapping та ін. Піксельні шейдери також використовуються для постефектів.

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

На чому пишуть шейдери?

Спочатку шейдери можна було писати assembler-like мовою, але пізніше з'явилися шейдерні мови високого рівня, схожі на мову С, такі як: Cg, GLSL і HLSL.

Такі мови набагато простіше ніж C, адже завдання, які вирішуються за їх допомогою, набагато простіше. Система типів у мовах відбиває потреби програмістів графіки. Тому вони надають програмісту спеціальні типи даних: матриці, семплери, вектори тощо.

RenderMan

Все, що ми обговорили вище відноситься до реальногочасу графіка. Але існують недійсні графіки. У чому різниця – realtime – реальний час, тобто тут і зараз – давати 60 кадрів на секунду у грі, це процес реального часу. А ось рендер комплексний кадр для ультрасучасної анімації по кілька хвилин це non-realtime. Суть у часі.

Наприклад, графіку такої якості, як в останніх мультиплікаційних фільмах студії Pixar, отримати в реальному часі ми зараз отримати не можемо. Дуже великі рендер-ферми обраховують симуляції світла за зовсім іншими алгоритмами, дуже витратними, але такими, що дають майже фотореалістичні картинки.

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

Наприклад, подивіться, на цей милий мультфільм, піщинки, пір'їнки пташки, хвилі, все виглядає неймовірно реальним.

*Відео можуть забанити на Youtube, якщо воно не відкривається, погуглите pixar sandpiper - короткометражний мультфільм для хороброго пісочника дуже милий і пухнастий. Зворушить і продемонструє наскільки крутою може бути комп'ютерна графіка.

Так це RenderMan від фірми Pixar. Він став першою мовою програмування шейдерів. API RenderMan є фактичним стандартом для професійного рендерингу, використовується у всіх роботах студії Pixar та не лише їх.

Корисна інформація

Тепер Ви знаєте, що таке шейдери, але крім шейдерів, є інші дуже цікаві теми в розробці ігор та комп'ютерній графіці, які напевно Вас зацікавлять:

  • , - техніка створення приголомшливих ефектів у сучасних відео-іграх. Оглядова стаття та відео з уроками створення ефектів у Unity3d
  • ,- якщо Ви замислюєтеся про розробку відеоігор як професійну кар'єру або хобі, ця стаття містить відмінний набір рекомендацій «з чого почати», «які книги читати» і т.д.

Якщо залишилися питання

Як завжди, якщо у Вас залишилися якісь питання, ставте їх у коментарях, я завжди відповім. За будь-яке добре слово чи виправлення помилок я буду дуже вдячний.

Вступ

Світ 3D графіки, у тому числі ігровий, наповнений термінами. Термінами, які завжди мають єдино правильне визначення. Іноді ті самі речі називаються по-різному, і навпаки, той самий ефект може називатися в налаштуваннях гри то "HDR", то "Bloom", то "Glow", то "Postprocessing". Більшості людей з похвальби розробників у тому, що вони вбудували у свій графічний движок, незрозуміло, що у реальності мало на увазі.

Стаття покликана допомогти розібратися, що ж означають деякі з цих слів, які найчастіше вживаються в таких випадках. У рамках цієї статті мова піде далеко не про всі терміни 3D графіки, а тільки про ті, які набули більшого поширення останнім часом як відмінні риси та технології, що застосовуються в ігрових графічних двигунах і як найменування графічних налаштувань сучасних ігор. Для початку настійно рекомендую ознайомитися з .

Якщо щось у цій статті та в статтях Олександра вам не зрозуміло, тобто сенс почати з раннього, з . Ці статті вже дещо застаріли, звичайно, але основні, найпочатковіші та найважливіші дані там є. Ми ж з вами поговоримо про більш "високрівневі" терміни. Основні поняття про 3D графік реального часу і пристрій графічного конвеєра у вас повинні бути. З іншого боку, не чекайте математичних формул, академічної точності та прикладів коду – стаття призначена зовсім не для цього. Терміни

Список термінів, описаних у статті:

Shader (Шейдер)

Шейдером у сенсі називається програма для візуального визначення поверхні об'єкта. Це може бути опис освітлення, текстурування, постобробки тощо. Шейдери виросли з робіт Кука (Cook's shade trees) і Перліна (Perlin's pixel stream language). Зараз найбільш відомі шейдери RenderMan Shading Language. shaders, displacement shaders, volume shaders, imager shaders... Ці шейдери найчастіше програмно виконуються універсальними процесорами і не мають повної апаратної реалізації.Надалі, багато дослідників описували схожі на RenderMan мови, але вони вже були призначені для апаратного прискорення: система PixelFlow і Lastra), Quake Shader Language (застосований id Software у графічному движку гри Quake III, який описував багатопрохідний рендеринг) та інші Peercy співтовариші розробили техніку для того, щоб програми з циклами та умовами виконувати на традиційних апаратних архітектурах за допомогою кількох проходів рендерингу Шейдери RenderMan розбивалися на дек тільки проходів, які комбінувалися у фреймбуфері. Пізніше з'явилися мови, які ми бачимо прискореними апаратно в DirectX і OpenGL. Так шейдери були адаптовані для графічних програм реального часу.

Відеочіпи раннього часу не були програмовані і виконували тільки заздалегідь запрограмовані дії (fixed-function), наприклад алгоритм освітлення був жорстко зафіксований в залозі, і не можна було нічого змінити. Потім, компанії-виробники відеочіпів поступово ввели у свої чіпи елементи програмованості, спочатку це були дуже слабкі можливості (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 для стислості) була покращена з піксельними шейдерами версії 1.4 (ATI R200), які пропонували велику гнучкість, але також мали занадто обмежені можливості. Шейдери на той час писалися на так званому assembly shader language, який близький до асемблера для універсальних процесорів. Його низький рівень доставляє певні складнощі для розуміння коду та програмування, особливо коли код програми великий, адже він далекий від елегантності та структурованості сучасних мов програмування.

Версія Shader Model 2.0 (SM2), з'явившись у DirectX 9 (що було підтримано відеочіпом ATI R300, що став першим GPU з підтримкою шейдерної моделі версії 2.0), серйозно розширила можливості шейдерів реального часу, запропонувавши більш довгі та складніші шейдери і помітно розширивши. Було додано можливість розрахунків із плаваючою комою в піксельних шейдерах, що також стало найважливішим покращенням. DirectX 9, в особі можливостей SM2, також привнесла і мова шейдерів високого рівня - high-level shader language (HLSL), дуже схожа на мову Сі. І ефективний компілятор, який переводить HLSL програми в низькорівневий код, "зрозумілий" для апаратних засобів. Причому доступно кілька профілів, призначених для різних апаратних архітектур. Тепер розробник може писати один код HLSL шейдера і компілювати його за допомогою DirectX в оптимальну програму для встановленого у користувача відеочіпа. Після цього виходили чіпи від NVIDIA, NV30 і NV40, які покращили можливості апаратних шейдерів ще на крок, додавши ще довші шейдери, можливості динамічних переходів у вершинних та піксельних шейдерах, можливість вибірки текстур з вершинних шейдерів та ін. З тих пір поки якісних змін не було, вони очікуються ближче до кінця 2006 року в DirectX 10…

В цілому, шейдери додали до графічного конвеєра безліч нових можливостей щодо трансформації та освітлення вершин та індивідуальної обробки пікселів так, як цього хочуть розробники кожної конкретної програми. І все-таки, можливості апаратних шейдерів досі не розкриті в додатках повністю, адже зі збільшенням їх можливостей у кожному новому поколінні "заліза" ми скоро побачимо рівень тих самих шейдерів RenderMan, які колись здавалися недосяжними для ігрових відеоприскорювачів. Поки що в шейдерних моделях реального часу, що підтримуються на сьогодні апаратними прискорювачами, визначено лише два типи шейдерів: і (у визначенні DirectX 9 API). У майбутньому DirectX 10 до них обіцяє додатись ще й .

Vertex Shader (Вершинний Шейдер)

Вершинні шейдери - це програми, що виконуються відеочіпами, які виробляють математичні операції з вершинами (vertex, з них складаються 3D об'єкти в іграх), інакше кажучи, вони надають можливість виконувати програмовані алгоритми зміни параметрів вершин та їх освітлення (T&L - Transform & Lighting) . Кожна вершина визначається декількома змінними, наприклад, положення вершини в просторі 3D визначається координатами: x, y і z. Вершини можуть бути описані характеристиками кольору, текстурними координатами тощо. Вершинні шейдери, залежно від алгоритмів, змінюють ці дані у процесі своєї роботи, наприклад, обчислюючи та записуючи нові координати та/або колір. Тобто вхідні дані вершинного шейдера - дані про одну вершину геометричної моделі, яка в даний момент обробляється. Зазвичай це координати у просторі, нормаль, компоненти кольору та текстурні координати. Результуючі дані виконуваної програми служать вхідними для подальшої частини конвеєра, розтеризатор робить лінійну інтерполяцію вхідних даних поверхні трикутника і кожного пікселя виконує відповідний піксельний шейдер. Дуже простий і грубий (але наочний, сподіваюся) приклад: вершинний шейдер дозволяє взяти 3D об'єкт сфери та вершинним шейдером зробити з нього зелений куб:).

До появи відеочіпа NV20 у розробників було два шляхи, або використовувати власні програми та алгоритми, що змінюють параметри вершин, але тоді всі розрахунки робив би CPU (software T&L), або покладатися на фіксовані алгоритми у відеочіпах, за допомогою апаратної трансформації та освітлення (hardware T&L ). Перша ж шейдерна модель DirectX означала великий крок вперед від фіксованих функцій трансформації та освітлення вершин до повністю програмованих алгоритмів. Стало можливим, наприклад, виконувати алгоритм скінінгу повністю на відеочіпах, а раніше єдиною можливістю було їх виконання на універсальних центральних процесорах. Тепер, з сильно покращеними з часів згаданого чіпа NVIDIA можливостями, з вершинами за допомогою вершинних шейдерів можна робити дуже багато (крім їх створення, хіба що) ...

Приклади того, як і де застосовуються вершинні шейдери:

Pixel Shader (Піксельний Шейдер)

Піксельні шейдери - це програми, що виконуються відеочіпом під час растеризації для кожного пікселя зображення, вони роблять вибірку з текстур та/або математичні операції над кольором та значенням глибини (Z-buffer) пікселів. Всі інструкції піксельного шейдера виконуються попіксельно, після того, як операції з трансформуванням та освітленням геометрії завершено. Піксельний шейдер у результаті своєї роботи видає кінцеве значення кольору пікселя та Z-значення для наступного етапу графічного конвеєра, блендінгу. Найбільш простий приклад піксельного шейдера, який можна навести: банальне мультитекстурування, просто змішання двох текстур (diffuse та lightmap, наприклад) та накладення результату обчислення на піксель.

До появи відеочіпів з апаратною підтримкою піксельних шейдерів, у розробників були лише можливості щодо звичайного мультитекстурування та альфа-блендингу, що суттєво обмежувало можливості з багатьох візуальних ефектів і не дозволяло робити багато з того, що зараз доступне. І якщо з геометрією ще щось можна було робити програмно, то з пікселями – ні. Ранні версії DirectX (до 7.0 включно) завжди виконували всі розрахунки повершинно та пропонували вкрай обмежену функціональність по попіксельному освітленню (згадуємо EMBM – environment bump mapping та DOT3) в останніх версіях. Піксельні шейдери уможливили освітлення будь-яких поверхонь попіксельно, використовуючи запрограмовані розробниками матеріали. Піксельні шейдери версії 1.1 (в розумінні DirectX), що з'явилися в NV20, вже могли не тільки робити мультитекстурування, але і багато іншого, хоча більшість ігор, що використовують SM1, просто використовували традиційне мультитекстурування на більшості поверхонь, виконуючи складніші піксельні шейдери лише на частини поверхів. створення різноманітних спецефектів (усі знають, що вода досі є найчастішим прикладом використання піксельних шейдерів в іграх). Зараз, після появи SM3 і відеочіпів, що підтримують їх, можливості піксельних шейдерів дорослі вже до того, щоб з їх допомогою робити навіть трасування променів (raytracing), нехай поки з деякими обмеженнями.

Приклади застосування піксельних шейдерів:

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

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

Переваги процедурних текстур також включають необмежений рівень деталізації кожної текстури, пікселізації просто не буде, текстура як би завжди генерується під необхідний для її відображення розмір. Великий інтерес представляє і анімований, з його допомогою можна зробити хвилі на воді, без застосування анімованих передбачуваних текстур. Ще один плюс таких текстур у тому, що чим більше їх застосовується у продукті, тим менше роботи для художників (щоправда, більше для програмістів) над створенням звичайних текстур.

На жаль, процедурні текстури не отримали поки належного застосування в іграх, в реальних додатках досі найчастіше простіше завантажити звичайну текстуру, обсяги відеопам'яті зростають не щодня, а щогодини, в найсучасніших прискорювачах ставлять вже 512 мегабайт виділеної відеопам'яті, яку треба чим позичати. Більше того, досі частіше роблять навпаки – для прискорення математики в піксельних шейдерах використовують lookup tables (LUT) – спеціальні текстури, що містять заздалегідь прораховані значення, які отримуються в результаті обчислень. Щоб не брати до уваги для кожного пікселя кілька математичних команд, просто читають заздалегідь обчислені значення з текстури. Але що далі, то сильніше акцент повинен зміщуватися саме у бік математичних обчислень, взяти самі відеочіпи ATI нового покоління: RV530 і R580, які кожні 4 і 16 текстурних блоків припадає 12 і 48 піксельних процесорів, відповідно. Тим більше, якщо мова про 3D текстури, адже якщо двомірні текстури без проблем можна розмістити в локальній пам'яті прискорювача, то 3D текстури вимагають її набагато більше.

Приклади процедурних текстур:

Bump Mapping/Specular Bump Mapping

Бампмапінг – це техніка симуляції нерівностей (або моделювання мікрорельєфу, як більше подобається) на плоскій поверхні без великих обчислювальних витрат та зміни геометрії. Для кожного пікселя поверхні виконується обчислення освітлення, виходячи зі значень у спеціальній карті висот, що називається bumpmap. Це зазвичай 8-бітна чорно-біла текстура та значення кольору текстури не накладаються як звичайні текстури, а використовуються для опису нерівності поверхні. Колір кожного текселя визначає висоту відповідної точки рельєфу, великі значення означають більшу висоту над вихідною поверхнею, а менші, відповідно, меншу. Чи навпаки.

Ступінь освітленості точки залежить від кута падіння променів світла. Чим менший кут між нормаллю та променем світла, тим більша освітленість точки поверхні. Тобто якщо взяти рівну поверхню, то нормалі в кожній її точці будуть однаковими і освітленість також буде однаковою. А якщо поверхня нерівна (власне, практично всі поверхні насправді), то нормалі в кожній точці будуть різними. І освітленість різна, в одній точці вона буде більшою, в іншій – меншою. Звідси і принцип бампмапінгу - для моделювання нерівностей для різних точок полігону задаються нормалі до поверхні, що враховуються при обчисленні освітлення попіксельного. В результаті виходить більш натуральне зображення поверхні, бампмаппінг дає поверхні велику деталізацію, таку, як нерівності на цеглині, пори на шкірі і т.п., без збільшення геометричної складності моделі, оскільки розрахунки ведуться на піксельному рівні. Причому при зміні положення джерела світла освітлення цих нерівностей правильно змінюється.

Звичайно, вершинне освітлення набагато простіше обчислювальне, але надто нереалістично воно виглядає, особливо при порівняно малополігональної геометрії, інтерполяція кольору для кожного пікселя не може відтворити значення більші, ніж розраховані значення для вершин. Тобто, пікселі в середині трикутника не можуть бути яскравішими, ніж фрагменти біля вершини. Отже, області з різкою зміною освітлення, такі як відблиски та джерела світла, дуже близько розташовані до поверхні, фізично неправильно відображаються, і особливо це буде помітно в динаміці. Звичайно, частково проблема розв'язана збільшенням геометричної складності моделі, її розбиттям на більшу кількість вершин та трикутників, але оптимальним варіантом буде попіксельне освітлення.

Для продовження необхідно нагадати про складові освітлення. Колір точки поверхні розраховується як сума ambient, diffuse і specular складових від усіх джерел світла в сцені (в ідеалі від усіх, часто багатьма нехтують). Вклад у це значення від кожного джерела світла залежить від відстані між джерелом світла та точкою на поверхні.

Складові освітлення:

А тепер додамо до цього бампмапінг:

Рівномірна (ambient) складова освітлення - апроксимація, "початкове" освітлення кожної точки сцени, у якому всі точки висвітлюються однаково і освітленість залежить від інших чинників.
Дифузна (diffuse) складова освітлення залежить від положення джерела освітлення та від нормалі поверхні. Ця складова освітлення різна кожної вершини об'єкта, що надає їм обсяг. Світло не заповнює поверхню однаковим відтінком.
Бликова (specular) складова освітлення проявляється у відблисках відбиття променів світла від поверхні. Для її розрахунку, крім вектора положення джерела світла та нормалі, використовуються ще два вектори: вектор напряму погляду та вектор відображення. Specular модель висвітлення вперше запропонував Фонг (Phong Bui-Tong). Ці відблиски істотно збільшують реалістичність зображення, адже рідкісні реальні поверхні не відбивають світло, тому спеціальна складова дуже важлива. Особливо в русі, тому що по відблиску відразу видно зміну положення камери або самого об'єкта. Надалі, дослідники вигадували інші способи обчислення цієї складової, складніші (Blinn, Cook-Torrance, Ward), що враховують розподіл енергії світла, його поглинання матеріалами та розсіювання у вигляді дифузної складової.

Отже, Specular Bump Mapping виходить таким чином:

І подивимося те саме на прикладі гри, Call of Duty 2:


Перший фрагмент картинки - рендеринг без бампмапінгу () взагалі, другий (праворуч-зверху) - бампмапінг без відблискової складової, третій - з відблискової складової нормальної величини, яка використовується в грі, і останній, праворуч-знизу - з максимально можливим значенням specular складової.

Що стосується першого апаратного застосування, то деякі види бампмапінгу (Emboss Bump Mapping) стали використовувати ще за часів відеокарт на базі чіпів NVIDIA Riva TNT, проте техніки на той час були вкрай примітивні і широкого застосування не отримали. Наступним відомим типом став Environment Mapped Bump Mapping (EMBM), але апаратною його підтримкою в DirectX в той час мали тільки відеокарти Matrox, і знову застосування було дуже обмежене. Потім з'явився Dot3 Bump Mapping і відеочіпи того часу (GeForce 256 і GeForce 2) вимагали три проходи для того, щоб повністю виконати такий математичний алгоритм, оскільки вони обмежені двома текстурами, що одночасно використовуються. Починаючи з NV20 (GeForce3), з'явилася можливість робити те саме за один прохід за допомогою піксельних шейдерів. Далі більше. Стали застосовувати ефективніші техніки, такі як .

Приклади застосування бампмапінгу в іграх:


Накладення карт зсуву (Displacement Mapping) є методом додавання деталей до тривимірних об'єктів. На відміну від бампмапінгу та інших попіксельних методів, коли картами висот правильно моделюється лише освітленість точки, але не змінюється її положення у просторі, що дає лише ілюзію збільшення складності поверхні, карти зміщення дозволяють отримати справжні складні 3D об'єкти з вершин та полігонів, без обмежень, властивих попіксельним методам. Цей метод змінює положення вершин трикутників, зрушуючи їх за нормаллю на величину, виходячи зі значень карт зсуву. Карта зсуву (displacement map) - це зазвичай чорно-біла текстура, і значення у ній використовуються визначення висоти кожної точки поверхні об'єкта (значення можуть зберігатися як 8-битные чи 16-битные числа), схоже на bumpmap. Часто карти зміщення використовуються (у цьому випадку вони називаються і картами висот) для створення земної поверхні з пагорбами та западинами. Так як рельєф місцевості описується двомірною картою зміщення, його відносно легко деформувати при необхідності, так як це вимагатиме лише модифікації карти зміщення і рендерингу на її основі поверхні в наступному кадрі.

Наочно створення ландшафту за допомогою накладання карт усунення представлене на зображенні. Вихідними були 4 вершини та 2 полігони, в результаті вийшов повноцінний шматок ландшафту.

Великою перевагою накладання карт зміщення не просто можливість додавання деталей до поверхні, а практично повне створення об'єкта. Береться низькополігональний об'єкт, розбивається (тесселюється) на більшу кількість вершин та полігонів. Вершини, отримані в результаті тесселяції, потім зміщуються нормалі, виходячи зі значення, прочитаного в карті зміщення. Отримуємо в результаті складний 3D об'єкт із простого, використовуючи відповідну displacement картку:


Кількість трикутників, створених при тесселяції, має бути достатньо великою для того, щоб передати всі деталі, що задаються картою зсувів. Іноді додаткові трикутники створюються автоматично за допомогою N-патчів або інших методів. Карти зміщення краще використовувати спільно з бампмапінгом для створення дрібних деталей, де достатньо правильного освітлення попіксельного.

Накладання карт зміщення вперше отримало підтримку в DirectX 9.0. Це була перша версія цього API, яка підтримала техніку Displacement Mapping. У DX9 підтримується два типи накладання карт зміщення, filtered і presampled. Перший метод був підтриманий вже забутим відеочіпом MATROX Parhelia, а другий - ATI RADEON 9700. Filtered метод відрізняється тим, що дозволяє використовувати міп-рівні для карт зміщення та застосовувати для них трилінійну фільтрацію. У такому методі міп-рівень карти усунення вибирається для кожної вершини на основі відстані від вершини до камери, тобто рівень деталізації вибирається автоматично. Таким чином досягається майже рівномірне розбиття сцени, коли трикутники мають приблизно однаковий розмір.

Накладання карт зміщення можна вважати суттєво методом стиснення геометрії, використання карт зміщення знижує обсяг пам'яті, необхідний для певної деталізації 3D моделі. Громіздкі геометричні дані заміщаються простими двомірними текстурами усунення, зазвичай 8-бітними або 16-бітовими. Це знижує вимоги до обсягу пам'яті та пропускної спроможності, необхідної для доставки геометричних даних до відеочіпа, а ці обмеження є одними з головних для сучасних систем. Або ж, при рівних вимогах до пропускної спроможності та обсягу пам'яті, накладання карт зміщення дозволяє використовувати набагато складніші геометрично 3D моделі. Застосування моделей значно меншої складності, коли замість десятків чи сотень тисяч трикутників використовують одиниці тисяч, дозволяє ще й прискорити їхню анімацію. Або поліпшити, застосувавши складніші комплексні алгоритми і техніки, на зразок імітації тканин (cloth simulation).

Інша перевага в тому, що застосування карт зсуву перетворює складні полігональні тривимірні сітки на кілька двомірних текстур, які простіше піддаються обробці. Наприклад, для організації можна використовувати звичайний міп-мапінг для накладання зсувних карт. Також замість порівняно складних алгоритмів стиснення тривимірних сіток можна застосовувати звичні методи стиснення текстур, навіть JPEG-подібні. Для процедурного створення 3D об'єктів можна використовувати звичайні алгоритми для двомірних текстур.

Але карти зміщення мають деякі обмеження, вони не можуть бути застосовані у всіх ситуаціях. Наприклад, гладкі об'єкти, що не містять великої кількості тонких деталей, будуть краще представлені у вигляді стандартних полігональних сіток або інших поверхонь вищого рівня, на зразок кривих Безьє. З іншого боку, дуже складні моделі, такі як дерева чи рослини, також нелегко уявити картами усунення. Є також проблеми зручності їх застосування, це майже завжди вимагає спеціалізованих утиліт, адже дуже складно безпосередньо створювати карти зміщення (якщо не йдеться про прості об'єкти, на кшталт ландшафту). Багато проблем і обмеження, притаманні картам усунення, збігаються з такими у , оскільки ці два методи по суті - два різні уявлення схожої ідеї.

Як приклад з реальних ігор наведу гру, в якій використовується вибірка текстур з вершинного шейдера, що з'явилася у відеочіпах NVIDIA NV40 і шейдерної моделі 3.0. Вершинне текстурування можна застосувати для простого методу накладання карт зміщення, що повністю виконується відеочіпом, без тесселяції (розбиття на більшу кількість трикутників). Застосування такого алгоритму обмежене, вони мають сенс, тільки якщо карти будуть динамічними, тобто змінюватимуться в процесі. Наприклад, це рендеринг великих водних поверхонь, що й зроблено у грі Pacific Fighters:


Нормалмапінг - це покращений різновид техніки бампмапінгу, описаної раніше, розширена її версія. Бампмаппінг був розроблений Млинцем (Blinn) ще в 1978 році, нормалі поверхні при цьому методі накладання рельєфу змінюються на основі інформації з карт висот (bump map). У той час як бампмапінг лише змінює існуючу нормаль для точок поверхні, нормалмаппінг повністю замінює нормалі за допомогою вибірки їх значень із спеціально підготовленої карти нормалей (normal map). Ці карти зазвичай є текстурами із збереженими в них заздалегідь прорахованими значеннями нормалей, представленими у вигляді компонент кольору RGB (втім, є й спеціальні формати для карт нормалей, у тому числі зі стисненням), на відміну від 8-бітових чорно-білих карт висот бампмапінгу.

Загалом, як і бампмапінг, це теж "дешевий" метод для додавання деталізації до моделей порівняно низької геометричної складності, без використання більшої кількості реальної геометрії, лише більш просунутий. Одне з найцікавіших застосувань техніки - суттєве збільшення деталізації низькополігональних моделей за допомогою карток нормалей, отриманих обробкою такої ж моделі високої геометричної складності. Карти нормалей містять більш докладний опис поверхні порівняно з бампмапінгом і дозволяють представити більш складні форми. Ідеї ​​з отримання інформації з високодеталізованих об'єктів були озвучені в середині 90-х років минулого століття, але тоді йшлося про використання . Пізніше, у 1998 році, були представлені ідеї про перенесення деталей у вигляді карт нормалей від високополігональних моделей до низькополігональних.

Карти нормалей надають більш ефективний спосіб зберігання докладних даних про поверхні, порівняно з простим використанням великої кількості полігонів. Єдине серйозне їхнє обмеження в тому, що вони не дуже добре підходять для великих деталей, адже нормалмапінг насправді не додає полігонів і не змінює форму об'єкта, він тільки створює видимість цього. Це лише симуляція деталей, з урахуванням розрахунку освітлення на піксельному рівні. На крайніх полігонах об'єкта та великих кутах нахилу поверхні це дуже добре помітно. Тому найбільш розумний спосіб застосування нормалмапінгу полягає в тому, щоб зробити низькополігональну модель досить деталізованою для того, щоб зберігалася основна форма об'єкта, і використовувати карти нормалей для додавання більш дрібних деталей.

Карти нормалей зазвичай створюються на основі двох версій моделі, низько- та високополігональної. Низькополігональна модель складається з мінімуму геометрії, основних форм об'єкта, а високополігональна містить все необхідне максимальної деталізації. Потім, за допомогою спеціальних утиліт, вони порівнюються один з одним, різниця розраховується і зберігається в текстурі, званої картою нормалей. При її створенні додатково можна використовувати і bump map для дуже дрібних деталей, які навіть у високополігональній моделі не змоделювати (пори шкіри, інші дрібні поглиблення).

Карти нормалей спочатку були представлені у вигляді звичайних текстур RGB, де компоненти кольору R, G і B (від 0 до 1) інтерпретуються як координати X, Y і Z. Кожен тексель в карті нормалей представлений як нормаль точки поверхні. Карти нормалей можуть бути двох видів: з координатами в model space (загальній системі координат) або tangent space (термін російською - "дотик", локальна система координат трикутника). Найчастіше застосовується другий варіант. Коли карти нормалей представлені в model space, вони повинні мати три компоненти, оскільки можуть бути представлені всі напрями, а коли в локальній системі координат tangent space, то можна обійтися двома компонентами, а третю отримати в піксельному шейдері.

Сучасні програми реального часу досі сильно програють пререндеренной анімації за якістю зображення, це стосується, перш за все, якості освітлення та геометричної складності сцен. Кількість вершин і трикутників, що розраховуються в реальному часі, обмежена. Тому дуже важливими є методи, що дозволяють знизити кількість геометрії. До нормалмапінгу були розроблені кілька таких методів, але низькополігональні моделі навіть з бампмапінгом виходять помітно гірше за складніші моделі. Нормалмаппінг хоч і має кілька недоліків (найочевидніший - оскільки модель залишається низькополігональною, це легко видно по її незграбних кордонах), але підсумкова якість рендерингу помітно покращується, залишаючи геометричну складність моделей низькою. Останнім часом добре видно збільшення популярності даної методики та використання її у всіх популярних ігрових двигунах. "Виною" цьому - комбінація відмінної результуючої якості та одночасне зниження вимог до геометричної складності моделей. Техніка нормалмапінгу зараз застосовується майже повсюдно, всі нові ігри використовують її максимально широко. Ось лише короткий список відомих ПК ігор з використанням нормалмапінгу: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, FEAR, Quake 4. Усі вони виглядають набагато краще, ніж ігри минулого, у тому числі через застосування карт нормалей.

Є лише один негативний наслідок застосування цієї техніки – збільшення обсягів текстур. Адже карта нормалей сильно впливає на те, як виглядатиме об'єкт, і вона має бути досить великої роздільної здатності, тому вимоги до відеопам'яті та її пропускної спроможності подвоюються (у разі стиснутих карток нормалей). Але зараз вже випускаються відеокарти з 512 мегабайтами локальної пам'яті, пропускна здатність її постійно зростає, розроблені методи стиснення спеціально для карток нормалей, тому ці невеликі обмеження не надто важливі, насправді. Набагато більший ефект, який дає нормалмапінг, дозволяючи використовувати порівняно низькополігональні моделі, знижуючи вимоги до пам'яті для зберігання геометричних даних, покращуючи продуктивність і даючи гідний візуальний результат.

Parallax Mapping/Offset Mapping

Після нормалмапінгу, розробленого ще в 1984 році, було рельєфне текстурування (Relief Texture Mapping), представлене Olivera і Bishop в 1999 році. Це метод накладання текстур, заснований на інформації про глибину. Метод не знайшов застосування в іграх, але його ідея сприяла продовженню робіт над паралаксмапінгом та його поліпшення. Kaneko в 2001 році представив parallax mapping, який став першим ефективним методом для попіксельного відображення ефекту паралаксу. У 2004 році Welsh продемонстрував застосування паралаксмапінгу на програмованих відеочіпах.

Цей метод, мабуть, має найбільше різних назв. Перелічу ті, які зустрічав: Parallax Mapping, Offset Mapping, Virtual Displacement Mapping, Per-Pixel Displacement Mapping. У статті для стислості застосовується перша назва.
Паралаксмаппінг - це ще одна альтернатива технікам бампмапінгу та нормалмапінгу, яка дає ще більше уявлення про деталі поверхні, більш натуралістичне відображення 3D поверхонь, також без надто великих втрат продуктивності. Ця техніка схожа одночасно на накладання карт зміщення та нормалмапінг, це щось середнє між ними. Метод також призначений для відображення більшої кількості деталей поверхні, ніж є у вихідній геометричній моделі. Він схожий на нормалмаппінг, але відмінність у тому, що метод спотворює накладання текстури, змінюючи текстурні координати так, що коли ви дивитеся на поверхню під різними кутами, вона виглядає опуклою, хоча насправді поверхня плоска і не змінюється. Іншими словами, Parallax Mapping - це техніка апроксимації ефекту усунення точок поверхні залежно від зміни точки зору.

Техніка зсуває текстурні координати (тому техніку іноді називають offset mapping) так, щоб поверхня виглядала більш об'ємною. Ідея методу полягає у тому, щоб повертати текстурні координати тієї точки, де видовий вектор перетинає поверхню. Це вимагає прорахунку променів (рейтрейсинг) для карти висот, але якщо вона не має дуже сильно змінюються значень ("гладка" або "плавна"), то можна обійтися апроксимацією. Такий метод хороший для поверхонь з висотами, що плавно змінюються, без прорахунку перетинів і великих значень зсуву. Подібний простий алгоритм відрізняється від нормалмапінгу всього трьома інструкціями піксельного шейдера: дві математичні інструкції та одна додаткова вибірка з текстури. Після того, як обчислено нову текстурну координату, вона використовується далі для читання інших текстурних шарів: базової текстури, карти нормалей тощо. Такий метод паралаксмапінгу на сучасних відеочіпах майже також ефективний, як звичайне накладання текстур, а його результатом є більш реалістичне відображення поверхні, порівняно з простим нормалмапінгом.

Але використання звичайного паралаксмапінгу обмежено картами висот з невеликою різницею значень. "Круті" нерівності обробляються алгоритмом некоректно, з'являються різні артефакти, "плавання" текстур та ін. Було розроблено кілька модифікованих методів для покращення техніки паралаксмапінгу. Декілька дослідників (Yerex, Donnelly, Tatarchuk, Policarpo) описали нові методи, що покращують початковий алгоритм. Майже всі ідеї ґрунтуються на трасуванні променів у піксельному шейдері для визначення перетинів деталей поверхонь один одним. Модифіковані методики отримали кілька різних назв: Parallax Mapping with Occlusion, Parallax Mapping with Distance Functio ns, Parallax Occlusion Mapping. Для стислості їх називатимемо Parallax Occlusion Mapping.

Методи Parallax Occlusion Mapping включають ще й трасування променів для визначення висот та обліку видимості текселів. Адже при погляді під кутом до поверхні текселі загороджують один одного, і, враховуючи це, можна додати до ефекту паралаксу більше глибини. Отримуване зображення стає реалістичніше і такі покращені методи можна застосовувати для більш глибокого рельєфу, він відмінно підходить для зображення цегляних і кам'яних стін, бруківки та ін. не повершинні. Саме тому метод має назви на кшталт Virtual Displacement Mapping та Per-Pixel Displacement Mapping. Подивіться на картинку, важко повірити, але каміння бруківки тут - лише попіксельний ефект:

Метод дозволяє ефективно відображати деталізовані поверхні без мільйонів вершин і трикутників, які були б потрібні при реалізації цього геометрією. При цьому зберігається висока деталізація (крім силуетів/гранів) та значно спрощуються розрахунки анімації. Така техніка дешевша, ніж використання реальної геометрії, використовується значно менша кількість полігонів, особливо у випадках з дуже дрібними деталями. Застосувань алгоритму безліч, а найкраще він підходить для каміння, цегли та подібного.

Також, додаткова перевага в тому, що карти висот можуть динамічно змінюватися (поверхня води з хвилями, дірки від куль у стінах та багато іншого). У недоліках методу - відсутність геометрично правильних силуетів (країв об'єкта), адже алгоритм попіксельний і є справжнім displacement mapping. Натомість він заощаджує продуктивність у вигляді зниження навантаження на трансформацію, освітлення та анімацію геометрії. Економить відеопам'ять, необхідну зберігання великих обсягів геометричних даних. У плюсах у техніки і відносно проста інтеграція в існуючі програми та використання в процесі роботи звичних утиліт, що застосовуються для нормалмапінгу.

Техніка вже застосовується у реальних іграх останнього часу. Поки що обходяться простим паралаксмапінгом на основі статичних карт висот, без трасування променів та розрахунку перетинів. Ось приклади застосування паралаксмапінгу в іграх:

Postprocessing (Постібробка)

У широкому значенні постобробка - це все те, що відбувається після основних дій по побудові зображення. Інакше кажучи, постобробка – це будь-які зміни зображення після його рендерингу. Постобробка є набір засобів для створення спеціальних візуальних ефектів, і їх створення проводиться вже після того, як основна робота з візуалізації сцени виконана, тобто, при створенні ефектів постобробки використовується готове растрове зображення.

Простий приклад із фотографії: ви сфотографували гарне озеро із зеленню за ясної погоди. Небо виходить дуже яскравим, а дерева надто темними. Ви завантажуєте фотографію у графічний редактор і починаєте змінювати яскравість, контраст та інші параметри для ділянок зображення або для всієї картинки. Але ви вже не можете змінити налаштування фотоапарата, ви робите обробку готового зображення. Це і є постобробка. Або інший приклад: виділення заднього плану у портретній фотографії та застосування blur фільтра до цієї області для ефекту depth of field з більшою глибиною. Тобто, коли ви змінюєте чи підправляєте кадр у графічному редакторі, ви робите постобробку. Те саме може робитися і в грі, в реальному часі.

Існує безліч різних можливостей обробки зображення після його рендерингу. Усі бачили, мабуть, у графічних редакторах безліч так званих графічних фільтрів. Це якраз те, що називається постфільтрами: blur, edge detection, sharpen, noise, smooth, emboss та ін. У застосуванні до 3D рендерингу в реальному часі це робиться так - вся сцена рендериться в спеціальну область, render target і після основного рендерингу це зображення додатково обробляється за допомогою піксельних шейдерів і потім виводиться на екран. З ефектів постобробки в іграх найчастіше використовують , , . Існує і безліч інших постефектів: noise, flare, distortion, sepia та ін.

Ось парочка яскравих прикладів постобробки в ігрових програмах:

High Dynamic Range (HDR)

High Dynamic Range (HDR) у застосуванні до 3D графіки – це рендеринг у широкому динамічному діапазоні. Суть HDR полягає в описі інтенсивності та кольору реальними фізичними величинами. Звичною моделлю опису зображення є RGB, коли всі кольори представлені у вигляді суми основних кольорів: червоного, зеленого та синього, з різною інтенсивністю у вигляді можливих цілих значень від 0 до 255 для кожного, закодованих вісьмома бітами на колір. Відношення максимальної інтенсивності до мінімальної, доступної для відображення конкретної моделі або пристрою, називається динамічним діапазоном. Так, динамічний діапазон моделі RGB становить 256:1 або 100:1 cd/m2 (два порядку). Ця модель опису кольору та інтенсивності загальноприйнято називається Low Dynamic Range (LDR).

Можливих значень LDR для всіх випадків явно недостатньо, людина здатна бачити набагато більший діапазон, особливо при малій інтенсивності світла, а модель RGB занадто обмежена в таких випадках (та й за більших інтенсивностей теж). Динамічний діапазон зору людини від 10 -6 до 10 8 cd/m 2 тобто 100000000000000:1 (14 порядків). Одночасно весь діапазон ми не можемо бачити, але діапазон, видимий оком у кожен момент часу, приблизно дорівнює 10000:1 (чотирьом порядкам). Зір пристосовується до значень з іншої частини діапазону освітленості поступово, за допомогою так званої адаптації, яку легко описати ситуацією з вимкненням світла в кімнаті в темний час доби - спочатку очі бачать дуже мало, але згодом адаптуються до умов освітлення, що змінилися, і бачать вже набагато більше . Те саме трапляється і при зворотній зміні темного середовища на світле.

Отже, динамічного діапазону моделі опису RGB недостатньо для представлення зображень, які людина здатна бачити в реальності, ця модель значно зменшує можливі значення інтенсивності світла у верхній та нижній частині діапазону. Найпоширеніший приклад, наведений у матеріалах HDR, - зображення затемненого приміщення з вікном на яскраву вулицю в сонячний день. З RGB моделлю можна отримати або нормальне відображення того, що знаходиться за вікном, або тільки те, що всередині приміщення. Значення більше 100 cd/m 2 LDR взагалі обрізаються, це є причиною того, що в 3D рендерингу важко правильно відображати яскраві джерела світла, спрямовані прямо в камеру.

Самі пристрої відображення даних поки серйозно поліпшити не можна, а відмовитися від LDR при розрахунках має сенс, можна використовувати реальні фізичні величини інтенсивності і кольору (або лінійно пропорційні), а на монітор виводити максимум того, що він зможе. Суть подання HDR у використанні значень інтенсивності та кольору в реальних фізичних величинах або лінійно пропорційних і в тому, щоб використовувати не цілі числа, а числа з точкою, що плаває, з великою точністю (наприклад, 16 або 32 біта). Це зніме обмеження RGB, а динамічний діапазон зображення серйозно збільшиться. Але потім будь-яке зображення HDR можна вивести на будь-якому засобі відображення (тому ж RGB моніторі), з максимально можливою якістю для нього за допомогою спеціальних алгоритмів .

HDR рендеринг дозволяє змінювати експозицію після того, як ми відрендерили зображення. Дає можливість імітувати ефект адаптації людського зору (переміщення з яскравих відкритих просторів до темних приміщень і навпаки), дозволяє виконувати фізично правильне освітлення, а також є уніфікованим рішенням для застосування ефектів постобробки (glare, flares, bloom, motion blur). Алгоритми обробки зображення, корекцію кольору, гамма-корекцію, motion blur, bloom та інші методи постобробки якісніше виконувати в HDR представленні.

У додатках 3D рендерингу реального часу (іграх, в основному) HDR рендеринг почали використовувати не так давно, адже це вимагає обчислень та підтримки render target у форматах з плаваючою точкою, які вперше стали доступними лише на відеочіпах з підтримкою DirectX 9. Звичайний шлях HDR рендерингу в іграх такий: рендеринг сцени в буфер формату з плаваючою точкою, постобробка зображення в розширеному колірному діапазоні (зміна контрасту та яскравості, колірного балансу, ефекти glare та motion blur, lens flare та подібні), застосування tone mapping для виведення підсумкової HDR картинки на LDR пристрій відображення. Іноді використовуються карти середовища (environment maps) в форматах HDR, для статичних відображень на об'єктах, дуже цікаві застосування HDR в імітації динамічних заломлень і відображень, для цього також можуть використовуватися динамічні карти у форматах з плаваючою точкою. До цього можна додати ще лайтмапи (light maps), заздалегідь розраховані та збережені у форматі HDR. Багато з перерахованого зроблено, наприклад, у Half-Life 2: Lost Coast.

HDR рендеринг дуже корисний для комплексної постобробки вищої якості порівняно зі звичайними методами. Той же bloom виглядатиме реалістичніше при розрахунках у моделі HDR представлення. Наприклад, як це зроблено у грі Far Cry від Crytek, там використовуються стандартні методи HDR рендерингу: застосування bloom фільтрів, представлені Kawase та tone mapping оператор Reinhard.

На жаль, в деяких випадках розробники ігор можуть приховувати під назвою HDR просто фільтр bloom, що розраховується у звичайному діапазоні LDR. І хоча більша частина в тому, що зараз роблять в іграх з HDR рендерингом, якраз і є bloom кращої якості, вигода від HDR рендерингу не обмежується цим постефектом, просто його зробити найлегше.

Інші приклади застосування HDR рендерингу у додатках реального часу:


Tone mapping - це процес перетворення діапазону яскравостей HDR до LDR діапазону, що відображається пристроєм виведення, наприклад, монітором або принтером, так як виведення HDR зображень на них вимагатиме перетворення динамічного діапазону та колірного охоплення моделі HDR у відповідний динамічний діапазон LDR, найчастіше модель RGB. Адже діапазон яскравості, представлений HDR, дуже широкий, це кілька порядків абсолютного динамічного діапазону одночасно, в одній сцені. А діапазон, який можна відтворити на звичних пристроях виведення (моніторах, телевізорах) становить лише близько двох порядків динамічного діапазону.

Перетворення з HDR на LDR і називається tone mapping, воно виконується з втратами та імітує властивості людського зору. Такі алгоритми називають операторами tone mapping. Оператори поділяють всі значення яскравості зображення на три різних типи: з темною, середньою та яскравою освітленістю. На основі оцінки яскравості середніх тонів коригується загальна освітленість, значення яскравості пікселів сцени перерозподіляються для того, щоб увійти у вихідний діапазон, темні пікселі освітлюються, а світлі затемнюються. Потім найбільш яскраві пікселі зображення приводяться до діапазону пристрою виведення або вихідної моделі подання. На наступній картинці зображено найпростіше приведення HDR зображення до діапазону LDR, лінійне перетворення, а до фрагмента в центрі застосований більш складний оператор tone mapping, що працює так, як було описано вище:

Видно, що тільки із застосуванням нелінійного tone mapping можна отримати максимум деталей у зображенні, а якщо приводити HDR до LDR лінійно, то багато дрібниць просто губляться. Єдино правильного алгоритму tone mapping немає, існує кілька операторів, які дають хороші результати у різних ситуаціях. Ось приклад двох різних операторів tone mapping:

Спільно з HDR рендерингом, віднедавна tone mapping почали застосовувати в іграх. Стало можливим опціонально імітувати властивості людського зору: втрату гостроти в темних сценах, адаптацію нових умов освітлення при переходах від дуже яскравих областей до темних і навпаки, чутливість до зміни контрасту, кольору… Ось так виглядає імітація здатності зору адаптації в грі Far Cry. Перший скріншот показує зображення, яке бачить гравець, що тільки-но повернувся від темного приміщення до яскраво освітленого відкритого простору, а другий - те саме зображення через пару секунд після адаптації.

Bloom

Bloom - це один із кінематографічних ефектів постобробки, за допомогою якого найбільш яскраві ділянки зображення робляться ще яскравішими. Це ефект дуже яскравого світла, що виявляється у вигляді свічення навколо яскравих поверхонь, після застосування bloom фільтра такі поверхні не просто отримують додаткову яскравість, світло від них (ореол) частково впливає і на темніші області, що є сусідами з яскравими поверхнями в кадрі. Найпростіше показати це на прикладі:

У 3D графіку Bloom фільтр робиться за допомогою додаткової постобробки - змішування змащеного фільтром blur кадру (всього кадру або окремих яскравих його областей, фільтр зазвичай застосовується кілька разів) та вихідного кадру. Один із найбільш часто застосовуваних в іграх та інших додатках реального часу алгоритм постфільтру bloom:

  • Сцена рендери у фреймбуфер, інтенсивність світіння (glow) об'єктів записується на альфа-канал буфера.
  • Фреймбуфер копіюється у спеціальну текстуру для обробки.
  • Роздільна здатність текстури зменшується, наприклад, у 4 рази.
  • До зображення кілька разів застосовуються фільтри згладжування (blur) на основі даних про інтенсивність, записаних в альфа-канал.
  • Отримане зображення поєднується з оригінальним кадром у фреймбуфері, і результат виводиться на екран.

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

Motion Blur

Змащування в русі (motion blur) відбувається при фото- та кінозйомці через рух об'єктів у кадрі протягом часу експозиції кадру, в той час, коли затвор об'єктива відкритий. Знятий камерою (фото, кіно) кадр не показує знімок, знятий миттєво, з нульовою тривалістю. Через технологічні обмеження кадр показує деякий проміжок часу, за цей час об'єкти в кадрі можуть здійснити переміщення на певну відстань, і якщо так відбувається, то всі положення об'єкта, що рухається, за час відкритого затвора об'єктива будуть представлені на кадрі у вигляді змащеного зображення по вектору руху . Так відбувається, якщо об'єкт переміщається щодо камери або камера щодо об'єкта, і величина змащування дає уявлення про величину швидкості руху об'єкта.

У тривимірній анімації, у кожен конкретний момент часу (кадр) об'єкти розташовані за певними координатами в тривимірному просторі, аналогічно віртуальній камері з нескінченно швидкою витримкою. В результаті, змащення, подібне до одержуваного камерою і людським оком при погляді на об'єкти, що швидко рухаються, відсутнє. Це виглядає неприродно та нереалістично. Розглянемо простий приклад: кілька сфер обертаються навколо якоїсь осі. Ось зображення того, як цей рух виглядатиме зі змащуванням і без нього:

За зображенням без змащування не можна навіть сказати, рухаються сфери чи ні, тоді як motion blur дає чітке уявлення про швидкість і напрямок руху об'єктів. До речі, відсутність змащування під час руху служить і причиною того, чому рух в іграх при 25-30 кадрах на секунду здається смиканим, хоча кіно і відео при цих параметрах частоти кадрів виглядає чудово. Для компенсації відсутності змащування в русі бажана або висока частота кадрів (60 кадрів за секунду або вище) або використання методів додаткової обробки зображення для емуляції ефекту motion blur. Це застосовується і для покращення плавності анімації та для ефекту фото- та кінореалістичності одночасно.

Найпростіший алгоритм motion blur для програм реального часу полягає у використанні для рендерингу поточного кадру даних з попередніх кадрів анімації. Але є і більш ефективні та сучасні методи motion blur, які не використовують попередні кадри, а ґрунтуються на векторах руху об'єктів у кадрі, також додаючи ще один крок постобробки до процесу рендерингу. Ефект змащування може бути як повноекранним (зазвичай робиться постобробкою), так і для окремих об'єктів, що найбільш швидко рухаються.

Можливі застосування ефекту motion blur в іграх: всі гоночні ігри (для створення ефекту дуже високої швидкості руху і для застосування при перегляді ТВ-подібних повторів), спортивні ігри (ті ж повтори, а в самій грі змащення можна застосовувати для об'єктів, що дуже швидко рухаються, на кшталт м'яча чи шайби), файтинги (швидкі рухи холодної зброї, рук та ніг), багато інших ігор (під час внутрішньоігрових тривимірних роликів на движку). Ось приклади застосування постефекту motion blur з ігор:

Depth Of Field (DOF)

Depth of field (глибина різкості), коротко, це розмивання об'єктів в залежності від їх положення щодо фокусування камери. У реальному житті, на фотографіях та в кіно ми бачимо однаково чітко не всі об'єкти, це пов'язано з особливістю будови ока та пристрою оптики фото- та кіноапаратів. У фото- та кінооптики є певна відстань, об'єкти, розташовані на такій відстані від камери, знаходяться у фокусі і виглядають на картинці різкими, а більш віддалені від камери або наближені до неї об'єкти виглядають, навпаки, розмитими, різкість знижується поступово при збільшенні або зниженні відстані .

Як ви здогадалися, це фото, а не рендеринг. У комп'ютерній графіці кожен об'єкт відрендерованого зображення ідеально чіткий, оскільки лінзи та оптика не імітується при розрахунках. Тому для досягнення фото- та кінореалістичності доводиться застосовувати спеціальні алгоритми, щоб зробити для комп'ютерної графіки щось схоже. Ці техніки симулюють ефект різного фокусу об'єктів, що знаходяться на різній відстані.

Одним із найпоширеніших методів при рендерингу в реальному часі є змішування оригінального кадру та його змащеної версії (кілька проходів blur фільтра) на основі даних про глибину для пікселів зображення. В іграх, для ефекту DOF є кілька застосувань, наприклад, це ігрові ролики на движку гри, повтори у спортивних та гоночних іграх. Приклади depth of field у реальному часі:

Level Of Detail (LOD)

Рівень деталізації (level of detail) у 3D додатках – це метод зниження складності рендерингу кадру, зменшення загальної кількості полігонів, текстур та інших ресурсів у сцені, загальне зниження її складності. Простий приклад: основна модель персонажа складається із 10000 полігонів. У тих випадках, коли в сцені, що обробляється, він розташований близько до камери, важливо, щоб використовувалися всі полігони, але на дуже великій відстані від камери в підсумковому зображенні він займатиме лише кілька пікселів, і сенсу в обробці всіх 10000 полігонів немає ніякого. Можливо, в цьому випадку буде достатньо сотні полігонів, а то й пари штук і спеціально підготовленої текстури для такого відображення моделі. Відповідно, на середніх відстанях має сенс використовувати модель, що складається з кількості трикутників більшого, ніж у найпростішої моделі, і меншого, ніж найбільш складної.

Метод LOD зазвичай використовується при моделюванні та рендерингу тривимірних сцен, з використанням кількох рівнів складності (геометричної або якоїсь іншої) для об'єктів, пропорційно відстані від них до камери. Метод часто використовується розробниками ігор зниження кількості полігонів у сцені й у поліпшення продуктивності. При близькому прихильності до камери використовуються моделі з максимумом деталей (кількість трикутників, розмір текстур, складність текстурування), для максимально можливої ​​якості картинки і навпаки, при видаленні моделей від камери використовуються моделі з меншою кількістю трикутників - збільшення швидкості рендерингу. Зміна складності, зокрема кількості трикутників в моделі, може відбуватися автоматично на основі однієї 3D моделі максимальної складності, а може - на основі декількох заздалегідь підготовлених моделей з різним рівнем деталізації. Використовуючи моделі з меншою деталізацією для різних відстаней, розрахункова складність рендерингу знижується, майже не погіршуючи загальну деталізацію зображення.

Метод особливо ефективний, якщо кількість об'єктів у сцені велика, і вони розташовані різних відстанях від камери. Наприклад візьмемо спортивну гру, таку як симулятор хокею чи футболу. Низькополігональні моделі персонажів використовуються, коли вони далеко від камери, а при наближенні моделі замінюються іншими, з великою кількістю полігонів. Цей приклад дуже простий і в ньому показується суть методу на основі двох рівнів деталізації моделі, але ніхто не заважає створити кілька рівнів деталізації для того, щоб ефект зміни рівня LOD не був помітний, щоб деталі в міру наближення об'єкта поступово "приростали".

Крім відстані від камери, для LOD можуть мати значення й інші фактори - загальна кількість об'єктів на екрані (коли один-два персонажі у кадрі, то використовуються складні моделі, а коли 10-20, вони перемикаються на простіші) або кількість кадрів на секунду (задаються межі значень FPS, за яких змінюється рівень деталізації, наприклад, при FPS нижче 30 знижуємо складність моделей на екрані, а при 60, навпаки, підвищуємо). Інші можливі фактори, що впливають на рівень деталізації - швидкість переміщення об'єкта (ракету в русі ви розглянути навряд чи встигнете, а ось равлик - запросто), важливість персонажа з ігрової точки зору (той самий футбол взяти - для моделі гравця, яким керуєте ви, можна використовувати більш складну геометрію та текстури, ви його бачите найближче і найчастіше). Тут все залежить від бажань та можливостей конкретного розробника. Головне - не переборщити, часті та помітні зміни рівня деталізації дратують.

Нагадаю, що рівень деталізації не обов'язково відноситься тільки до геометрії, метод може застосовуватися і для економії інших ресурсів: при текстуруванні (хоча відеочіпи і так використовують міпмапінг, іноді є сенс міняти текстури на льоту на інші, з іншою деталізацією), технік освітлення (близькі об'єкти висвітлюються за складним алгоритмом, а далекі - за простим), технік текстурування (на ближніх поверхнях використовується складний паралаксмаппінг, а на далеких - нормалмаппінг) тощо.

Приклад з гри показати не так просто, з одного боку, тією чи мною мірою LOD застосовується майже в кожній грі, з іншого - наочно показати це не завжди виходить, інакше мало б сенсу в самому LOD.

Але на даному прикладі все ж таки видно, що найближча модель автомобіля має максимальну деталізацію, наступні дві-три машини теж дуже близькі до цього рівня, а всі далекі мають видимі спрощення, ось лише найзначніші: відсутні дзеркала заднього виду, номерні знаки, склоочисники і додаткова світлотехніка. А від найдальшої моделі немає навіть тіні на дорозі. Це і є алгоритм level of detail у дії.

Global Illumination

Реалістичне освітлення сцени змоделювати складно, кожен промінь світла насправді багаторазово відбивається і заломлюється, кількість цих відбитків не обмежена. А в 3D рендерингу кількість відображень сильно залежить від розрахункових можливостей, будь-який розрахунок сцени є спрощеною фізичною моделлю, а зображення, що отримується в результаті, лише наближено до реалістичності.

Алгоритми освітлення можна розділити на дві моделі: пряме або локальне освітлення та глобальне освітлення (direct або local illumination та global illumination). Локальна модель освітлення використовує розрахунок прямої освітленості, світло від джерел світла до першого перетину світла з непрозорою поверхнею, взаємодія об'єктів між собою не враховується. Хоча така модель намагається компенсувати це додаванням фонового або рівномірного (ambient) освітлення, але це найпростіша апроксимація, дуже спрощене освітлення від усіх непрямих променів джерел світла, яке задає колір та інтенсивність освітлення об'єктів без прямих джерел світла.

Тієї ж трасуванням променів розраховується освітленість поверхонь тільки прямими променями від джерел світла і будь-яка поверхня, для того, щоб бути видимою, повинна бути безпосередньо освітлена джерелом світла. Цього недостатньо для досягнення фотореалістичних результатів, крім прямого освітлення, потрібно враховувати і вторинне освітлення відбитими від інших поверхонь променями. У реальному світі промені світла відбиваються від поверхонь кілька разів, поки не згаснуть зовсім. Сонячне світло, що проходить через вікно, висвітлює всю кімнату цілком, хоча промені не можуть безпосередньо досягати всіх поверхонь. Чим яскравіше джерело світла, тим більше разів він буде відображатися. Колір поверхні, що відбиває, також впливає на колір відбитого світла, наприклад, червона стіна викличе червону пляму на сусідньому об'єкті білого кольору. Ось наочна різниця, розрахунок без урахування вторинного освітлення та з урахуванням такого:

У глобальній моделі освітлення, global illumination, розраховується освітлення з урахуванням впливу об'єктів один на одного, враховуються багаторазові відбиття та заломлення променів світла від поверхонь об'єктів, каустика (caustics) та підповерхневе розсіювання (subsurface scattering). Ця модель дозволяє отримати більш реалістичну картинку, але ускладнює процес, вимагаючи значно більше ресурсів. Існує кілька алгоритмів глобального illumination, ми коротко розглянемо radiosity (розрахунок непрямого освітлення) і photon mapping (розрахунок глобального освітлення на основі карт фотонів, розрахованих за допомогою трасування). Є і спрощені методи симуляції непрямого освітлення, такі, як зміна загальної яскравості сцени залежно від кількості та яскравості джерел світла в ній або використання великої кількості точкових джерел світла, розставлених по сцені для імітації відбитого світла, але все ж таки це далеко від справжнього алгоритму GI.

Алгоритм radiosity це процес розрахунку вторинних відбитків променів світла від одних поверхонь до інших, а також від навколишнього середовища до об'єктів. Промені від джерел світла трасуються до тих пір, поки сила їх не знизиться нижче за певний рівень або промені досягнуть певної кількості відбитків. Це поширена техніка GI, обчислення зазвичай виконуються перед візуалізацією, а результати розрахунку можна використовувати для рендерингу реального часу. Основні ідеї radiosity засновані на фізиці теплового перенесення. Поверхні об'єктів розбиваються на невеликі ділянки, звані патчами, і приймається, що відбите світло розсіюється рівномірно на всі боки. Замість розрахунку кожного променя для джерел світла, використовується техніка усереднення, що розділяє джерела світла на патчі, ґрунтуючись на рівнях енергії, які вони видають. Ця енергія розподіляється між патчами поверхонь пропорційно.

Ще один метод розрахунку глобального освітлення запропонований Henrik Wann Jensen, це метод фотонних карт photon mapping. Використання фотонних карт - це інший алгоритм розрахунку глобального освітлення, що ґрунтується на трасуванні променів і використовується для імітації взаємодії променів світла з об'єктами сцени. Алгоритмом розраховуються вторинні відбиття променів, заломлення світла через прозорі поверхні, розсіяні відбиття. Цей метод полягає у розрахунку освітленості точок поверхні у два проходи. У першому виконується пряме трасування променів світла з вторинними відбиттями, це попередній процес, що виконується перед основним рендерингом. У цьому методі розраховується енергія фотонів, що йдуть від світла до об'єктів сцени. Коли фотони досягають поверхні, точка перетину, напрямок та енергія фотона зберігаються в кеш, який називають фотонною картою. Фотокартки можуть зберігатися на диску для подальшого використання, щоб не прораховувати їх кожен кадр. Відображення фотонів прораховуються доти, доки робота не зупиняється після певної кількості відображень або при досягненні певної енергії. У другому проході рендерингу виконується розрахунок освітлення пікселів сцени прямими променями, з урахуванням даних, збережених у фотонних картах, енергія фотонів додається енергії прямого освітлення.

Розрахунки global illumination, використовують велику кількість вторинних відбитків, займають набагато більше часу, ніж розрахунки прямого висвітлення. Існують техніки для апаратного розрахунку радіосіті в реальному часі, які використовують можливості програмованих відеочіпів останніх поколінь, але поки що сцени, для яких розраховується глобальне освітлення в реальному часі, мають бути досить простими і в алгоритмах робиться багато спрощень.

Але ось що давно використовують - так це статичне передбачане глобальне освітлення, що прийнятно для сцен без зміни становища джерел світла та великих об'єктів, які сильно впливають на освітлення. Адже розрахунок глобального освітлення не залежить від положення спостерігача і якщо в сцені не змінюється становище таких об'єктів сцени та параметрів джерел освітлення, можна використовувати заздалегідь прораховані значення освітленості. Це використовують у багатьох іграх, зберігаючи дані GI розрахунків у вигляді лайтмапів (lightmaps).

Існують і прийнятні алгоритми для імітації глобального висвітлення динаміці. Наприклад, є такий простий метод для використання в додатках реального часу, для розрахунку непрямого освітлення об'єкта в сцені: спрощений рендеринг всіх об'єктів зі зниженою деталізацією (за винятком того, для якого вважають освітлення), кубічну карту низької роздільної здатності (її також можна використовувати для відображення динамічних відображень на поверхні об'єкта), потім фільтрація цієї текстури (кілька проходів blur фільтра), та застосування для освітлення цього об'єкта даних із розрахованої текстури як доповнення до прямого освітлення. У випадках, коли динамічний розрахунок надто важкий, можна обійтися статичними radiosity картами. Приклад з гри MotoGP 2, на якому добре видно сприятливий вплив навіть такої простої імітації GI:



Ця інструкція допоможе тобі встановити шейдери в Майнкрафт і тим самим покращити ігровий світ за рахунок додавання динамічних тіней, вітру та шуму трави, реалістичної води та багато іншого.

Відразу варто відзначити що шейдери досить сильно навантажують систему і якщо у вас слабка відеокарта або зовсім інтегрована, то рекомендуємо утриматися від установки цього мода.

Установка складається з двох етапів, спочатку потрібно встановити мод на шейдери, а потім додаткові шейдерпаки до нього

КРОК #1 - Встановлення моди на шейдери

  1. Завантажте та встановіть Java
  2. Встановіть OptiFine HD
    або ShadersMod;
  3. Розпаковуємо отриманий архів у будь-яке місце;
  4. Запускаємо файл jar, т.к. він є інсталером;
  5. Програма вкаже вам шлях до гри, якщо все правильно, натискаємо Yes, Ok, Ok;
  6. Переходимо в .minecraftі створюємо там папку shaderpacks;
  7. Заходимо до лаунчера і бачимо у рядку новий профіль з ім'ям "ShadersMod", якщо ні, то вибираємо вручну.
  8. Далі потрібно завантажити шейдерпаки

КРОК #2 - Встановлення шейдерпаку

  1. Завантажте шейдерпак, що вас цікавить (список в кінці статті)
  2. Натисніть клавіші WIN+R
  3. Перейдіть до .minecraft/shaderpacks. Якщо такої папки немає, створіть її.
  4. Перемістіть або вийміть архів з шейдерами в .minecraft/shaderpacks. Повинен вийти такий шлях: .minecraft/shaderpacks/ІМ'Я_ПАПКИ_ШЕЙДЕРА/shaders/[.fsh та.vsh файли всередині]
  5. Запустіть Майнкрафт і перейдіть Установки > Shaders. Тут ви побачите список доступних шейдерів. Виберіть потрібний
  6. У налаштуваннях шейдерів увімкніть "tweakBlockDamage", відключіть "CloudShadow" та "OldLighting"

Sonic Ether's Unbelievable Shaders
Sildur's shaders
Chocapic13"s Shaders
sensi277"s yShaders
MrMeep_x3"s Shaders
Naelego's Cel Shaders
RRe36"s Shaders
DeDelner's CUDA Shaders
bruceatsr44"s Acid Shaders
Beed28"s Shaders
Ziipzaap's Shader Pack
robobo1221"s Shaders
dvv16"s Shaders
Stazza85 super Shaders
hoo00"s Shaders pack B
Regi24"s Waving Plants
MrButternuss ShaderPack
DethRaid"s Awesome Graphics On Nitro Shaders
Edi"s Shader ForALLPc"s
CrankerMan's TME Shaders
Kadir Nck Shader (для skate702)
Werrus"s Shaders
Knewtonwako"s Life Nexus Shaders
CYBOX shaderpack
CrapDeShoes CloudShade Alpha
AirLoocke42 Shader
CaptTatsu"s BSL Shaders
Triliton"s shaders
ShadersMcOfficial"s Bloominx Shaders (Chocapic13" Shaders)
dotModded's Continuum Shaders
Qwqx71"s Lunar Shaders (chocapic13"s shader)

З глобальною комп'ютеризацією до нашого світу прийшла величезна кількість незрозумілих термінів. Розбиратися з ними всіма не так просто, як здається на перший погляд. Багато хто з них схожий назви, багато хто має широкий функціонал. Настав час дізнатися, що таке шейдер, звідки він узявся, навіщо потрібен і який буває.

Оптимізатор

Швидше за все, ви затятий гравець у «Майнкрафт» і саме тому прийшли дізнатися, що це таке. Варто одразу зазначити, що поняття «шейдер» спокійно відокремлюється від цієї гри та може «жити» від неї окремо. Так само, як і моди. Тому міцно пов'язувати ці поняття не варто.

Взагалі, шейдер родом із програмування, з'явився як помічник фахівцям. Напевно, гучним називатиме цей інструмент оптимізатором, але він реально покращує картинку в іграх. Отже, коли ви вже почали приблизно розуміти, що це, перейдемо до точного тлумачення.

Тлумачення

Що таке Шейдер? яку виконують процесори відеокарти. Ці інструменти розробляють спеціальною мовою. Залежно від призначень може бути різним. Після цього шейдери умовно транслюються в інструкції до процесорів графічних прискорювачів.

Застосування

Відразу слід зазначити, що застосування загалом зумовлено призначенням. Програми впроваджують у процесори відеокарт, отже, вони працюють над параметрами об'єктів та зображень тривимірної графіки. Вони можуть виконувати масу завдань, серед яких і робота з відображенням, заломленням, затемненням, ефектами зсуву та ін.

Передумова

Люди вже давно намагаються дізнатися, що таке шейдер. Ще до цих програм розробники робили все вручну. Процес формування зображення з деяких об'єктів не автоматизовано. Перш ніж гра з'являлася світ, розробники самостійно займалися рендерингом. Вони працювали з алгоритмом, становили його під різні завдання. Так з'являлися інструкції накладання текстур, відеоефектів тощо.

Звичайно, деякі процеси все ж таки були вбудовані в роботу відеокарт. Такі алгоритми могли використати розробники. Але їм ніяк не виходило нав'язати свої алгоритми відеокарті. Нестандартні інструкції могли виконуватися центральним процесором, який був повільнішим за графічний.

приклад

Щоб зрозуміти різницю, варто розглянути пару прикладів. Очевидно, що у грі рендеринг міг бути апаратним та програмним. Наприклад, всі ми пам'ятаємо знамениту Quake 2. Так ось, вода в грі могла бути просто синім фільтром, якщо йдеться про апаратний рендеринг. А ось за програмного втручання з'явився плескіт води. Та ж історія і з CS 1.6. Апаратний рендеринг давав лише білий спалах, а програмний додавав пікселізований екран.

Доступ

Так стало зрозуміло, що необхідно вирішувати такі проблеми. Графічні прискорювачі почали розширювати кількість алгоритмів, що були популярними серед розробників. Стало зрозуміло, що все «запхати» неможливо. Потрібно було відкрити спеціалістам доступ до відеокарти.

Перш ніж з'явилися ігри типу «Майнкрафт» із модами та шейдерами, розробникам дали можливість працювати з блоками GPU у конвеєри, які могли б відповідати за різні інструкції. Так стали відомі програми під назвою «шейдер». Для їхнього створення спеціально розробили мови програмування. Так, відеокарти стали навантажувати як стандартної «геометрією», а й інструкцією для процесора.

Коли такий доступ став можливим, почали відкриватися нові можливості програмування. Фахівці могли вирішувати математичні завдання на GPU. Такі розрахунки стали називатися GPGPU. Для цього процесу були потрібні спеціальні інструменти. Від компанії nVidia CUDA, Microsoft DirectCompute, а також фреймворк OpenCL.

Типи

Чим більше люди дізнавалися, що таке шейдери, тим більше відкривалося інформації про них та їхні можливості. Спочатку прискорювачі мали три процесори. Кожен відповідав за власний тип шейдера. Згодом їх замінили на універсальний. Кожен мав певний комплекс інструкцій, які одразу мали три типи шейдерів. Незважаючи на поєднання роботи, опис кожного типу зберігся досі.

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

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

В іграх

Якщо ви шукаєте шейдери для Майнкрафт 1.5.2, то ви, швидше за все, просто хочете поліпшити картинку в грі. Щоб таке стало можливим, програми пройшли «вогонь, воду та мідні труби». Шейдери тестували та доопрацьовували. У результаті стало зрозумілим, що цей інструмент має переваги і недоліки.

Звичайно, простота у складанні різних алгоритмів – це величезний плюс. Це і гнучкість, і помітне спрощення у процесі розробки гри, а отже, і зменшення вартості. Віртуальні сцени стають складнішими і реалістичнішими. Також сам процес розробки стає у рази швидше.

З недоліків варто відзначити лише те, що доведеться вивчати одну з мов програмування, а також враховувати, що на різних моделях відеокарт розміщується різний комплекс алгоритмів.

Встановлення

Якщо ви знайшли шейдер пак для Майнкрафта, потрібно розуміти, що існує багато підводних каменів в його установці. Незважаючи на популярність цієї гри, що вже згасає, все ж таки залишаються її віддані шанувальники. Не всім подобається графіка, тим більше у 2017 році. Дехто вважає, що завдяки шейдерам вони зможуть її покращити. Теоретично це твердження правильне. Але на практиці ви зміните небагато.

Але якщо ви все одно шукаєте способи, на Майнкрафт 1.7, то, перш за все, будьте уважні. Сам процес нічого складного не уявляє. До того ж разом з будь-яким завантажуваним файлом є інструкція щодо його встановлення. Головне, це перевірити версії гри та шейдера. Інакше оптимізатор не спрацює.

В інтернеті багато місць, де можна встановити та завантажити такий інструмент. Далі потрібно розпакувати архів у будь-яку папку. Там ви знайдете файлик "GLSL-Shaders-Mod-1.7-Installer.jar". Після запуску вам буде вказано шлях до гри, якщо він вірний, то погодьтеся з усіма наступними вказівками.

Після цього потрібно перемістити папку «shaderpacks» в «.minecraft». Тепер під час запуску лаунчера потрібно буде зайти в налаштування. Тут, якщо установка пройшла коректно, з'явиться рядок "Shaders". З усього списку можна вибрати потрібний пакет.

Якщо вам потрібні шейдери для Minecraft 1.7.10, то просто знаходите шейдерпак потрібної версії і робите те саме. В інтернеті можуть траплятися нестабільні версії. Іноді доводиться їх змінювати, встановлювати заново і шукати відповідний. Краще дивитися на відгуки та вибирати найбільш популярні.

Сподобалася стаття? Поділіться з друзями!