Як насправді працює нормальне відображення?


10

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

Як я думаю про нормали та їх відношення до кольорів RGB, полягає в наступному. Одинична сфера являє собою будь-яку можливу нормальну одиницю - іншими словами, компоненти X, Y і Z в одиничному нормальному векторі знаходяться в межах від -1 до 1. Компоненти кольору RGB всі варіюються від 0 до 255. Тому це має сенс для відображення -1 (звичайний компонент) до 0 (кольоровий компонент), 0 до 127 або 128 та 1 до 255. Будь-яке значення між ними просто лінійно інтерпольоване.

Застосування цього відображення до нормалів довільного 3D-об'єкта призводить до отримання дуже барвистої картини, зовсім не синьої. Наприклад, коли брати кубик, усі шість граней мали б різний, але рівномірний колір. Наприклад, обличчя з нормальним (1,0,0) було б (255,128,128), обличчя з нормальним (0,0, -1) було б (128,128,0) тощо.

Однак чомусь звичайні карти куба, які я знайшов, є повністю синюватими, тобто (128,128,255). Але очевидно, що нормали не всі в позитивному напрямку z, тобто (0,0,1). Як це працює?

[Редагувати]

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

[Редагувати 2]

Я, мабуть, повинен зазначити, що я працюю з кусково-параметричними поверхнями. Ці поверхні складаються з набору поверхневих патчів , де кожен патч асоціюється з власним параметричним простором (u, v) = [0,1] x [0,1]. У будь-якій точці поверхні нормальність може бути точно обчислена. Мабуть, вектори T ( дотична ) і B ( бі-дотична ) - необхідні для простягання дотичного простору - не є просто частковими похідними поверхневого пластиру в напрямку u і v ...


Ви коли-небудь намагалися реалізувати фонг або хоча б розсіяне затінення? Чи знаєте ви основні формули, як точка (a, b) = cos (кут (a, b)) для одиничних векторів a, b? Кілька годин на реалізацію врятують вас років боротьби.
Іван Кукір

@Ailurus: дивіться мій коментар / відповідь про те, як підійти до тієї ж проблеми для місцевих об'єктів / полів висоти. Це дійсно стає складніше для інших об'єктів, але поняття не повинні відрізнятися.
теодрон

Окремий випадок місцевість нормального mappping: gamedev.stackexchange.com/questions/43894 / ...
teodron

Відповіді:


14

Відображення текстури - це зіставлення між точками на поверхні 3D та їх відповідними точками на зображенні текстури. Якщо у вас є відображення текстури 1: 1, то кожна точка на поверхні 3D відображає конкретну та унікальну точку текстурного зображення (хоча зворотне значення не повинно бути правдивим. Деякі місця текстури не обов'язково відображатимуть місця на поверхні).

Завдяки такому зіставленню ви зможете пройти 3D поверхню і зберегти кожну окрему норму у відповідному місці текстури.

Гаразд добре, давайте це зробимо. Ми пройдемо 3D-поверхню і згенеруємо об’єкт-простір нормалізує відображені місця, а потім вклеїмо їх у текстуру. Отже, коли ми хочемо візуалізувати, ми просто вибираємо об'єкт-простір, звичайний з текстури, і ми закінчуємо. Правильно?

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

Тож загалом те, що люди використовують, - це звичайні карти, де нормали знаходяться у "дотичному просторі". Дотичний простір - це простір відносно відображеної точки на поверхні 3D, де немодифікована нормаль знаходиться в напрямку + Z, а осі X і Y вказують вздовж осей U і V відносно поверхні.

Дотичний простір по суті регулює норми. У дотичному просторі нормальний (0, 0, 1) завжди означає "немодифікований"; це нормальне значення, яке ви отримуєте від інтерполяції вершини нормальної. Це призводить до ряду корисних речей, які ви можете зробити , одна з найважливіших з яких - це зберігання їх у меншій кількості даних.

Оскільки Z завжди буде позитивним, ви можете обчислити його у своєму шейдері з компонентів X та Y. Так як вам потрібно всього лише 2 значення, так що можна використовувати (в OpenGL формат зображення номенклатурі ) GL_RG8, формат 2-байтового на піксель , а не GL_RGBA8в 4 х байт на піксель ( по- GL_RGB8, як і раніше буде 4-байт на піксель , оскільки графічні процесори будуть заміщувати кожен піксель на 4 байти). Ще краще, ви можете стиснути ці два значення , що призводить до формату 1 байт на піксель. Таким чином, ви зменшили розмір текстури до 75% від звичайної карти об’єктного простору.

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


Добре, тому перший тип карти, яку ви описуєте, - це нормальна карта об'єкт-простір , правда? Це тим більш барвистим, оскільки він зберігає реальні компоненти X, Y і Z нормалів. Другий тип, нормальна карта дотичного простору , схоже, зберігає щось подібне до збурень нормалам, а не самим нормалам. Я прочитаю концепцію дотичного простору і перевіряю ще пізніше.
Айлур

Добре, тому дотичний простір точки на поверхні - просто простір усіх дотичних векторів цієї точки. Однак у такому випадку я не бачу, як нормальне, як видно з дотичного простору, може бути чим іншим, ніж (0,0,1)? Іншими словами, я завжди очікую, що нормальна карта буде рівномірно синьою (128,128,255). Однак приклад, показаний на сторінці wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ), містить інші кольори. Я розумію, як ця карта може бути використана для зміни нормалів, але не як вона насправді розраховується.
Ейлур

@Ailurus: " Гаразд, тому дотичний простір точки на поверхні - просто простір усіх дотичних векторів цієї точки. Ні, це не так. Це простір, визначений (немодифікованим) нормалом і напрямком координат текстури в цій точці на поверхні. Він регулював нормальне, що зберігається в текстурі, як відносне до відображення текстури та поточне нормальне перед модифікаціями.
Нікол Болас

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

@ NicolBolas А, я заплутався, оскільки деякі джерела стверджують, що вектори T, B і N утворюють ортонормальну основу, тоді як інші згадують, що це не обов'язково так.
Айлур

3

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

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


Дякуємо, що уточнили це! Однак я використовую не багатокутну сітку як поверхню, а кусочно гладку параметричну поверхню . Тому всі нормали будуть збережені як такі, що вказують у напрямку (0,0,1), правда?
Айлур

1

Прокрутіть вниз на цій сторінці

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

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

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

Тепер цей приклад зосередився на звичайній карті ОБЕКТУ - це визначення нормалей щодо об'єкта, і це інваріантно при будь-якому обертанні, перекладі чи масштабуванні - або об'єкта, і камери, або чогось іншого - як згадувалося раніше, це лише один вид звичайної карти, але це найпоширеніша


0

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

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

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


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