карти нормалей
Карти нормалей. частина I
Добрий день.
Іноді по роботі мені доводиться питати у дизайнерів про те, чи зможуть вони зробити карту нормалей і використовувати її на свою модель. У більшості випадків відповідь негативна.
Що це за технологія і звідки вона взялася?
Трохи з історії карт нормалей.
SIGGRAPH (The Special Interest Group for Computer Graphics) група SIGGRAPH спеціальна група в складі ASM, яка об'єднує фахівців з комп'ютерної графіки. Проводить щорічні конференції, призначені для художників і аніматорів, що працюють з комп'ютерною графікою.
Що ж таке карта нормалей?
Карта нормалей (normal map) - це подальший розвиток такої технології як бамп (bump (англ.) - вигин, опуклість; опукла вм'ятина, здуття). Іноді карти нормалей називають «3-х точкова бамп-карта» (Dot3 bump mapping).
Бамп-карта спотворює значення нормалей полігонів, а карта нормалей повністю їх замінює. Тобто оригінальні нормалі об'єкта замінюються нормалями з високополігональні моделі.
Як і бамп, карти нормалей збільшує візуальну деталізацію 3d-моделі без додавання додаткових полігонів.
Бамп розраховується на основі текстури з одним каналом (grayscale - відтінки сірого). Карти нормалей використовують багатоканальну RGB-текстуру.
Карта нормалей розраховується для кожного пікселя текстури. Значення кожного з каналів RGB - це XYZ координати нормалі текселя.
Тексель (текстурний елемент, текстурний піксель) - це основний елемент, що становить текстуру. Кожна текстура являє собою масив текселей, так само як картинка - це масив пікселів.
Зазвичай карти нормалей існують в 2-х варіаціях: об'єктне простір (object-space) і дотичний простір (tangent-space). Вони відрізняються системою координат, в якій нормалі вимірюються і зберігаються.
Tangent space (простір дотичних, дотичний простір) - це узагальнення на випадок довільного різноманіття понять дотичній прямій для одновимірних кривих і дотичній площині для двовимірних поверхонь.
Як бачите - все просто :)
Хочете більше теорії - знайдете в англомовному Інтернеті.
По-простому кажучи: 1 тексель текстури з картами нормалей замінює 10 полігонів, а може і більше.
Найбільше «Норман», напевно, в іграх.
Гра, в якій я вперше відчув, що таке «нормал» - DOOM 3 виробництва id Software.
Ось вони - кишки з картами нормалей.
Справжні «нормальні» монстри.
Це не гра, а гімн картками нормалей. Вони там всюди.
Чи не грали в ДУМ 3?
А про «Зед-Браш» (ZBRUSH) чули?
Цей програмний продукт створений для того, щоб знімати красиві карти нормалей (ну і багато іншого ще зробити дозволяє).
У підсумку можна сказати, що використання карт нормалей - досить стара і популярна технологія.
Тим не менш, не так вже й багато 3d дизайнерів використовують можливості карт нормалей в своїй роботі.
Я думаю, справа в уявній складності технологічного процесу.
Кнопок багато. Які треба натискати, щоб «вийшло»? Таємниця.
Ні. Я і сам дізнався про ці «нормалі» недавно.
Я малював бамп, використовуючи відтінки сірого. Іноді перетворював кольорове зображення в сіре, а потім за допомогою спеціального фільтра в Фотошопі перетворював його в карту нормалей.
Для того, щоб зробити об'ємні цеглинки на стіні, отвори від куль або ще які-небудь дрібниці, ця технологія підходить.
Спробуємо подолати технологічні складнощі, зробивши найпростішу карту нормалей.
Я робив це в 3ds max.
Переходимо в 3ds max 9
Спробуємо зробити карту нормалей для цього об'єкта.
Це 2 полігону, з'єднаних під прямим кутом.
Ось «вусики» нормалей. За 2 штуки на фейс (видно в Edit Mesh при включенні однієї галочки).
Я хочу добитися від цього незграбного об'єкта згладжених кутів, як на скріншоті нижче.
Ось що у нас є перед початком роботи.
Увага! На об'єкти повинна бути призначена тільки одна група згладжування.
Насамперед треба розкласти анврапа на нізкополігональних моделі.
Саме на анврапа спрощеної моделі будуть спроектовані деталі високополігональні моделі.
Як ляже анврапа, так і станеться проектування. Якщо анврапа «кривий» - чекайте неправильної карти нормалей.
Виділивши спрощений об'єкт, відразу перейдемо в Unwrap UVW і зробимо Flatten Maping з установками за замовчуванням.
Ось що вийшло. Червоним обведено проблемне місце.
Це розрив UV-координат. Я спеціально наклав на об'єкт просту текстуру, яка допомагає продемонструвати проблему.
Від розривів необхідно позбавлятися по максимуму або ховати їх в непомітні місця.
Пару раз відобразимо наші полігони. Трохи посунемо. Саме посунемо, а не растянем. Об'єднаймо точки (Weld).
Біла лінія на стику говорить про те, що розриву текстурних координат немає.
І на текстурі все в порядку.
Тепер треба поєднати об'єкти. Для цього зазвичай досить помістити Pivot об'єкта в центр об'єкта (робиться для двох об'єктів автоматично) і вирівняти об'єкт один відносного іншого по всіх осях координат.
Вирівнюємо об'єкти щодо один одного. Ctrl + A
Увага! Об'єкти знаходяться в точці з координатами 0,0,0
Деякі дії, які я роблю, можливо, надлишкові, але мені вони допомогли вирішити багато проблем.
Виділивши нізкополігональних об'єкт, застосовуємо модифікатор «Проекція» (Projection).
Цей модифікатор буде проектувати щось з одного об'єкта на інший. У нашому випадку щось - карта нормалей.
Вказуємо - з якого об'єкта буде зніматися карта нормалей. Без цього нічого працювати не буде.
Вибираємо деталізовану геометрію, клікнувши по об'єкту (Pick) або вибравши зі списку присутніх в сцені (Pick List).
Увага! Щоб не заплутатися, я назвав простий об'єкт - LowPoly, а складний HiPoly.
З'явився Контейнер (cage) - фіолетові лінії. Він охоплює моделі. Що в нього потрапить - то і буде спроектована. Іноді контейнер дуже кривої, особливо на моделях зі складною геометрією - тоді робимо Скидання (Reset).
Без ресета в Макса нікуди!
Після скидання контейнер щільно притулиться до спрощеного об'єкту, повторюючи його форми. Ми повинні збільшити контейнер. Не забудьте: що в ньому - то і потрапить на карту нормалей.
Увага! Контейнер не повинен перетинати сам себе або нізкополігональних об'єкт.
Натискаємо 0 (нуль) - з'являється вікно Render to Texture.
Буває потрібно вказати Target Slot. Це щоб Макс знав, куди класти свежесгенерірованную текстуру. За умовчанням вибраний Бамп.
Макс рендерить. Але ми не бачимо Норман.
Так, під час рендери його не видно. Зате в зазначеному місці створюється файл. Ось що вийшло у мене.
Схоже на нормал. Як перевірити працює він чи ні?
У слот Normal призначаємо звичайний Bitmap з нашої текстурою.
Зверніть увагу, я відключив диффузную текстуру. Вона заважала оцінити результат.
Можна подивитися, якщо хочеться, як ліг нормал, включивши відображення текстури (кубик з шашечками) Bitmap'a в слоті Normal.
Теж ніби все правильно.
Результат добре видно на рендер. Запускаємо звичайний сканлайн.
Де нізкополігональних «куточок»?
А ось з такого ракурсу?
Зробимо картинку крупніше.
Якби не кут - то помітити різницю було б досить складно.
А ось у вьюпорте.
Карта нормалей готова!
Високополігональні об'єкт - 64 полігону.
Нізкополігональних - 2 полігону.
Візуальні відмінності мінімальні. Мета досягнута.
Хоча звичайно багато залежить від ракурсу :-)
Що далі?
Далі купа глюків, проблем і шаманства.
Наступного разу спробуємо зробити що-небудь складніше.