Яке призначення обсягу канонічного виду?


15

Зараз я вивчаю OpenGL і не змогла знайти відповідь на це питання.

Після того, як матриця проекцій буде застосована до простору перегляду, простір перегляду «нормалізується» так, що всі точки лежать у межах [-1, 1]. Зазвичай це називається "об'єм канонічного перегляду" або "нормалізовані координати пристрою".

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

Яка мета цього кроку?

Відповіді:


7

Найважливіше те, що воно перетворює ваші точки (вершини) з простору 3D-простору в 2D-простір екрану.

Це означає, що після множення вершин за допомогою цієї матриці координати X і Y розташовуються на екрані (між [-1, 1]), а Z - глибиною. Z використовується для буфера глибини і визначає, наскільки далеко знаходиться вершина (або фрагмент) від ваших камер поблизу площини.

Проекція означає, що вершини, які розташовані ближче від площини, розташовані ближче до середини екрана -> трикутник, що знаходиться ближче до камери, здається, більший за той, що знаходиться далеко. І це грунтується на вашому полі зору - ви вводите його в якусь функцію createProjectionMatrix або createFrustum. Це спрацьовує, що вона зрізає та розміщує ваші фрукти камери та вершини в кубі одиниці. Значення, що перевищують 1 і менше -1, не відображаються.

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

Проста відповідь:
він визначає ваш фруктовий замах і добре:

  • зробіть предмети, які знаходяться поруч із вами, виглядати більшими, ніж об’єкти, які знаходяться далеко від вас.
  • зберігати співвідношення пікселів - Всім подобається квадратний піксель, так? :)

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

Матриця проекції визначає усічені камери. Але це не пояснює причину того, що [-1,1] є канонічним обсягом перегляду. Чому б натомість не [-100,100]?
— бобобобо

1
тому що 1 - "більш поширене число", ніж 100: D (0 навіть частіше, але куб 0x0x0 не дуже цікавий ...)
— Іван Кукір

5

Ця відповідь буде довго після факту, але оскільки я знайшов це в Google, можливо, це все-таки допоможе комусь. Я просто хочу уточнити, що говорили JasonD і Notabene: Набагато простіше робити обрізні обчислення (з'ясовуйте, що ви повинні бачити, а що ви не повинні бачити, через який шлях ви дивитесь, наскільки це далеко, тощо. .). Замість того, щоб перевіряти, чи все перетинає площини на кордонах вашої точки зору, ви просто порівнюєте x, y, z усього з xMax, xMin, yMax, ect. , оскільки у вас просто куб. Це трохи складніше, якщо ви хочете мати лише щось із показаних, але математика все-таки краща з одиничним кубом, ніж з фрустумом.

Кілька речей, які я знайшов оманливими в інших відповідях:

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

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

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

TLDR: Це робить відсікання простішим.

Редагувати: bobobobo має суть цього. Все - це трикутники, загалом: D.

Джерело: Приймаючи університетський клас графіки


Хоча цікаво, здається, що ваші пункти частково правдиві. Ви не використовуєте однорідну матрицю, це просто те, що в просторі кліпу точки визначаються в однорідному просторі. 2) правда, у просторі кліпів понти ще не проектуються на екран. Це трапляється після розділення точки зору, хоча зауважте, що це обов'язково трапляється, коли ви повертаєтеся з простору кліпу назад до декартового простору. 3) так і ні. Перетворення координат точок у простір NDC все ще якимось чином необхідно. Що не потрібно, це місце для кліпів, яке є специфічним для GPU. ...
— користувач18490

... Це не просто необхідний етап кліпу, а не перенастроювання на одиничний куб. Ваше останнє припущення також не вірно. Ви перезаписуєте до -1 до 1, тому що простіше перейти з простору NDC до растрового простору (перетворення вікна перегляду). Насправді ще простіше, якщо ви простір NDC знаходиться в діапазоні [0,1], що стосується певної реалізації. Зрештою, це все математика, тому впевнені, що можна використовувати інші умовності. дивіться хороший веб-сайт scrapipixel для отримання більш детальної інформації.
— користувач18490


1

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


Ви неправі, коли ви говорите про деталі обладнання. Є не. Крім того, якщо ви пишете, що у вас є власний растаризатор на процесорі (навіщо це робити? Щоб дізнатися, як працює цей матеріал :)), ви використовуєте ті ж матриці, що і на gpu. Вам пощастило, що я все ще не маю привілеїв, щоб проголосувати вниз :)
— Нотабене

Чи не потрібно знати співвідношення сторін? Як я розумію, він зберігає коефіцієнти масштабування для X і Y, щоб згодом зображення матиме правильне співвідношення сторін.
— breadjesus

3
Виправте мене, якщо я помиляюся, але він говорить про те, як ви проектуєте пункти, і таким чином ми говоримо 2D. Якщо це так, то OpenGL не знає, куди на екран ви ставите це зображення, а також про те, як воно буде відображатися. Він створює зображення, яке потім легко масштабувати та розміщувати правильно, але це не робить для вас. Я згоден, що деталі апаратних засобів були поганою назвою для цього, я просто мав на увазі вище. Також ви можете вказати матрицю проекцій із співвідношенням сторін, але це співвідношення не повинно бути таким, як у монітора.
— Chewy Gumball

3
Треба сказати, що мені дуже подобається ця розмова. Ви поруч, щоб мати рацію. Давайте заглибимось. Немає зображення після багатопланових вершин projMat. Результатом є лише встановлення 2D точки з глибиною. Після чого починається растаризація, вона створює зображення. (якщо на процесорі він намалював лінії між вершинами трикутників і заповнив його (і заштрихував би його) - на gpu він виконується безпосередньо перед шейдером пікселів / фрагментів). І співвідношення сторін ставить бали, які слід "зменшити" до значень більше 1 або менше -1, і вони не відображатимуться.
— Нотабене

2
AHHH! Я бачу питання тут. Він сказав, що "це, як правило, називається" об'єм канонічного перегляду "або" нормалізовані координати пристрою ". Я відповідав так, ніби він питав про нормалізовані координати пристрою, проте насправді він взагалі не питав про них. Насправді це дві абсолютно різні речі, і саме тому ми тут розходимося. Можливо, це слід уточнити, щоб люди не робили тієї самої помилки, яку я робив.
— Chewy Gumball

1

Я зауважу, що відповідь вже прийнято, але для відсікання зазвичай корисно перетворити фрустум виду в одиничний куб.


Правда, я трохи відредагував свою відповідь, щоб бути більш зрозумілим з цього приводу.
— Нотабене

До речі, одиничний куб - це куб сторони 1. Отже, назва недоречна. Натомість слід називати канонічний обсяг перегляду.
— користувач18490

1

Мені теж це було цікаво. Є кілька речей, які слід розглянути.

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

Приємна річ у цьому зараз, ви можете скласти трикутники досить легко. (Якщо всі 3 вершини трикутника мають x > 1або x < -1тоді цей трикутник можна збити).


0

Я б рекомендував перевірити урок з матриці перспективного проекції на Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

Це чітко пояснює, що тому, щоб перетворити простір плоду виду на одиничний куб. Чому? По суті, тому, що процес проектування 3D-точок на полотно бере участь у перетворенні на них простору NDC, тобто простору, в якому точки на екрані перезастосовуються в діапазоні [-1,1] (якщо припустимо, що екран є квадратним). Тепер ми також переставляємо точку Z-координати до діапазону [0,1] (або іноді [-1,1]), тому в кінцевому підсумку ви закінчуєте кубом. Справа в тому, що, коли точки містяться в кубі, їх легше обробити, ніж коли вони визначені у вигляд фрустру (що є дивним простором, усіченою пірамідою). Ще одна причина полягає в тому, що це своєрідне приведення всіляких проективних перетворень, які ви можете уявити в CG, до того ж простору (одиничний куб). Тож незалежно від того, використовуєте ви, наприклад, перспективну чи ортографічну проекцію,

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

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