Для чого нам потрібна четверта координата, щоб ділити на z?


12

Я прочитав відповідь тут:

Що робить відеокарта з четвертим елементом вектора як кінцевим положенням?

"Четвертий компонент - хитрість відстежувати перспективну проекцію. Коли ви робите перспективну проекцію, ви хочете поділити на z: x '= x / z, y' = y / z, але це не операція, яка може бути реалізована матрицею 3x3, що працює на векторі x, y, z. Трюк, який став стандартним для цього, - це додавання четвертої координати, w та оголошення, що x, y, z завжди буде розділено на w зрештою, всі трансформації застосовуються і до растерізації ".

але я не розумів, чому ми не могли розділити на z за допомогою матриці 3x3?

чи не можемо ми просто помножити на

1/z 0 0
0 1/z 0
0 0 1/z

отримати [x/z y/z 1]

?


Спробуйте висловити трансформацію (або композицію перетворень), яка включає переклад десь у ланцюжку. Без значення aw ви не можете виразити його в одній матриці.
DMGregory

Я розумію частину перекладу, але просто не зрозумів, як додавання четвертої координати допоможе, або це трюк для поділу на z

Для того, що тобі цілком варто, ти можеш зробити те, що ти сказав. Розділення x і y на z є дійсним методом перетворення 3d-координат у 2d-екран на екрані з проекцією, де віддалених об'єктів стає менше. W - це однорідна координата, щоб перенести її до четвертого виміру, щоб мати можливість робити переклад.
Алан Вулф

Відповіді:


14

Тому що, якщо ви розділите [x, y, z]лише zви отримаєте, [x/z, y/z, 1]і ви втратили фактичне значення z, що є фактично корисним, якщо ви хочете зробити відсікання площини поблизу / вдалині або заповнити Z-буфер.

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

Наприклад, у випадку перспективної проекції це отриманий 4-компонентний вектор:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Після точки зору ділення вектор стає:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

І c + d/zчастина залишає нам достатньо інформації для заповнення буфера Z.


Ви могли розділити лише X і Y на Z, отримуючи [x / z, y / z, z]. GPU не повинен робити векторний поділ, він міг бути розроблений для будь-якого обчислення.
користувач253751

3

Технічно ви могли це зробити. Але навіщо турбуватися? До того моменту, коли ви закінчите цей фінал z, ви могли:

  • побудуйте матрицю 3х3, як ви описали, витрачаючи 9 * sizeof(float)байти місця, витрачаючи цикли на обчислення 1/z(одне ділення), а потім роблячи дев'ять множень і шість додавань, щоб отримати остаточну вершину, або
  • Ви можете зробити три відділення, як це робить сучасний трубопровід

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

Крім того, матриця 3x3 не може кодувати переклад, і тому матриця 4x4 (і, отже, четверта wкоордината) в будь-якому випадку використовується раніше . Це означає, що у вас вже є той четвертий компонент, який ви можете сидіти там, так що ви можете також використовувати його для транспортування корисної вартості і робити свій поділ з ним.

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