Нормальні карти проти звичайних карт


17

Я використовую імпортер активів Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) для розбору 3d моделей.

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

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

Чому існує два способи отримати норми, який вважається найкращим практиком і чому?

Відповіді:


31

Коротка відповідь

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

Довга відповідь

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

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

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

Оскільки нормалі обчислюються на основі геометричних властивостей сітки / поверхні, Normal Maps надасть вам альтернативні Нормали, які можуть імітувати шишки, щоб додати деталі до поверхні, не додаючи більше полігонів.

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

Навіщо нам потрібно обоє?

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

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

Розширення відповіді, щоб пояснити, чому важливі дотичні простори:

Коротка відповідь: дотичні простори використовуються для того, щоб зробити звичайні карти незалежними від основної геометрії.

[EDIT] Додано зображення для відображення нормальної карти в дотичному просторі та нормальної карти у світовому просторі.

введіть тут опис зображення

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

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

введіть тут опис зображення

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

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

Представлення дотичного простору


1
Якщо ви зможете знайти зображення із зображенням того, як одна нормальна текстура не може бути послідовно використана без нормального та дотичного поля, визначеного за вершиною, ви зробите це найкращим варіантом відповіді на цю дивовижну проблему для більшості початківців графічних програмістів!
теодрон

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

1
@AnastasiosG Я думаю, що він говорить про поведінку, що змінюється за замовчуванням для різних даних, оскільки вона стає інтерпольованою через трикутник щоразу, коли фрагмент обчислюється для певного примітиву. Я знаю, що був прапор, який ви можете використовувати, щоб сказати OpenGL використовувати один конкретний нормальний з можливих 3 вершинних норм трикутника, але це не поведінка за замовчуванням, як я знаю.
теодрон

1
@AnastasiosG Я подумав, що така деталь не дасть жодної користі, оскільки мова не йде про те, як використовувати OpenGL. Але якщо це допоможе, у епоху фіксованого конвеєра вам знадобився glShadeModel (GL_SMOOTH), щоб повідомити openGL про інтерполяцію. У програмовану епоху конвеєра ви визначаєте змінні як мінливі або вхідні / вихідні в шейдері, щоб OpenGL міг інтерполювати.
concept3d

Я хотів би додати, що збірні карти - це просто (геометричні) нормали, які піднімаються / опускаються на основі чорно-білої текстури. :)
Ентальпі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.