- А як воно діє?
- Що таке рельєфна карта (текстура)?
- Як реалізувати?
- Виконання швидкого рельєфного текстурування (Fast Bump mapping)
- [Читайте на цю тему: Затінення по Фонгу ]
Рельєфне текстурування грунтується на техніці виконання затінення по Фонгу, тому, якщо ви не прочитали попередні розділи, пропоную зробити це прямо зараз.
Рельєфне текстурування дуже нагадує звичайний процес накладення ( "натягування") текстури на полігон. Тільки при звичайному накладення текстури ми працюємо з кольором і змінюємо його колірне сприйняття, а ось при рельєфному текстуруванні ми додаємо відчуття рельєфу, об'ємності плоскому полігону. Ця техніка може додати деталізацію сцені без створення додаткових полігонів. Зауважте, що полігон і раніше залишається плоским, але створюється відчуття його опуклості (рельєфності).
Розгляньте куб на малюнку, складається враження, що він складається з безлічі дрібних полігонів, що описують карбування і клепки. Але в дійсності цей куб складається з 6 плоских чотирикутних полігонів. Ви можете задати питання, а чому ж це відрізняється від звичайного текстурирования. Відповідь - рельєфне текстурування відображає реальний стан джерела світла в сцені і навіть зміна його місця розташування. (Тим, хто цікавиться можна порадити прочитати статтю, присвячену реалізації рельєфного текстурування в DirectX6 )
А як воно діє?

Подивіться на малюнок. З відстані єдиний спосіб визначити, що зображення відображає рельєфну поверхню, - це проаналізувати зміни яскравості окремих ділянок зображення. Наш мозок робить це автоматично, непомітно для нас. В результаті ми чітко визначаємо, що буде опуклістю, що западиною.
Дуже схоже на видавлювання (карбування). Але, по суті, єдине, що було зроблено для додання об'ємності плоскому зображенню, - це правильне накладення яскравих і темних ділянок. Інше робить наш мозок.
Але як визначити, які біти зображення робити яскравими, і навпаки. Дуже просто. Більшість людей протягом свого життя тривало знаходяться в умовах, коли світло виходить зверху. Таким чином, людина звикла, що більшість поверхонь зверху яскраво освітлені, а знизу, навпаки, перебувають у тіні і будуть темніше. Таким чином, якщо око сприймає світлі і темні області на об'єкті, то людина сприймає їх як рельєф.
Потрібні ще докази? Подивіться на той же малюнок, тільки розгорнутий на 180 градусів. Він став схожий на повну протилежність попередньому. Те, що раніше здавалося опуклим, стало увігнутим, і навпаки. А адже це те ж саме зображення.
Проте, наш мозок все-таки не настільки дурний :). Якщо ви зможете змусити себе подумати, що світло виходить знизу, мозок відтворить інформацію так само, як на першому зображенні. Спробуйте!
Що таке рельєфна карта (текстура)?

Рельєфна карта (текстура) - це звичайна текстура, тільки на відміну від першої, що несе інформацію про колір певних ділянок, рельєфна карта несе інформацію про нерівностях. Найпоширеніший спосіб представити нерівності - це застосувати карту висот. Карта висот - це текстура в відтінках сірого, де яскравість кожного пікселя представляє, наскільки він видається з базової поверхні. (Див. Малюнок справа). Дуже простий і зручний метод. Його легко реалізувати.
Навіть в псевдотривимірного іграх і додатках, через свою простоту, цей метод використовується дуже широко. Наприклад, гра SimSity3000. Рельєф місцевості там задається bitmap текстурою з градацією яскравості від 0 до 255. Де 50 відповідає нульовому рівню землі.0 - найглибшим частинах річок і озер, а 255 - означатимуть вершини найвищих гір. Bump maps дуже широко використовуються розробниками в багатьох пакетах роботи з графікою і трьох-мірними об'єктами.
Але це просто відступ, що показує діапазон застосування bump maps.
Використовуючи карту висот, ви зможете імітувати нерівності практично будь-якій поверхні: дерево, камінь, що лущиться фарбу і т.д. Звичайно, у всього є свої межі. Використовуючи bump mapping, ви не зможете імітувати великі западини і височини, але ось для імітації нерівностей і шорсткостей на поверхні цей метод підходить ідеально.
Як реалізувати?
По суті, це логічне продовження техніки прорахунку Phong shading. При використанні Phong shading ми інтерпольованого нормаль до поверхні по всьому полігону, і цей вектор використовувався для подальшого визначення яскравості відповідного пікселя (Див. Главу, присвячену затінення по Фонгу ). Реалізуючи bump mapping, ми трохи змінюємо напрямок вектора нормалі, грунтуючись на інформації, що міститься в карті висот. Змінюючи положення вектора нормалі в конкретній точці полігону, ми, відповідно, міняємо яскравість поточного пікселя (пам'ятаєте, закон косинуса з теорії світла :)) Все дуже просто!
Для того, щоб цього досягти, існує кілька шляхів. Давайте розглянемо один з можливих способів.
Для початку нам потрібен спосіб для перетворення інформації про висоту нерівностей на карті висот в інформацію про величину підстроювання вектора нормалі. Це, власне кажучи, нескладно, але трохи важко для пояснення. Все ж таки постарайтеся зрозуміти.
Спочатку нам потрібно перетворити висоти з карти (bump map) в маленькі вектори, по одному на кожен піксель. Подивіться на збільшений малюнок зліва. Більш світлі квадрати відповідають більш опуклим ділянкам. Зрозуміло. Тепер, для кожного пікселя (на нашому малюнку квадрат відповідає пікселю) ми повинні розрахувати вектор, який вказує нам напрямок ухилу поверхні. Малюнок справа демонструє нам це. Маленькі червоні вектори вказують на зменшення висоти. Для визначення цих векторів, ми визначимо величину градієнта для кожного пікселя:
- x_gradient = pixel (x-1, y) - pixel (x + 1, y) y_gradient = pixel (x, y-1) - pixel (x, y + 1),
де х і y - координати відповідного пікселя
Тепер, маючи в руках значення градієнтів, ми зможемо підкоригувати вектор нормалі в відповідному пікселі.
Зліва - полігон з початковим вектором нормалі, позначених n. Також показані два вектори, які будуть використані для зміни положення (напрямки) нормалі до пікселя під ним. Обидва вектора повинні розташовуватися паралельно осях координат застосовуваної карти висот.
Справа показані карта висот і полігон. На обох малюнках показані напрямки U і V осей координат карти (текстури) висот.
Перерахувати новий вектор нормалі легко:
New_Normal = Normal + (U * x_gradient) + (V * y_gradient)
Отримавши новий вектор нормалі, ми може прорахувати яскравість даного пікселя, використовуючи раніше вивчену технологію затінення по Фонгу.
Виконання швидкого рельєфного текстурування
(Fast Bump mapping)
Вище ви дізналися, що при рельєфному текстуруванні проводиться зміна вектора нормалі до поверхні на площі всього полігону відповідно до карти висот. Ви так само пам'ятайте, що для прискорення прорахунку затінення по Фонгу ми застосували метод із заздалегідь прорахованою Phong map, яка представляє собою набір яркостей для всіх можливих нормалей на полігоні. Таким чином, не треба бути генієм, щоб припустити, що швидко виконуваних варіантом рельєфного текстурування буде прорахунок зсувів до карти затінення по Фонгу. Результуючою яскравістю пікселя буде сума значень, отриманих з карти затінення і рельєфною карти. Використовуючи цей підхід, ми одночасно будемо виробляти затінення по Фонгу з урахуванням рельєфності малюнка.
[Читайте на цю тему: Затінення по Фонгу ]
[Незабаром буде продовження: Прорахунок тіней]
Матеріал для даної статті люб'язно надав Hugo Elias
А як воно діє?
Що таке рельєфна карта (текстура)?
Як реалізувати?
Потрібні ще докази?
Що таке рельєфна карта (текстура)?
Як реалізувати?