Z-буферизація

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Принцип дії Z-буфера

Z-буферизація (англ. Z-buffering) (інша назва: глибинна буферизація (англ. depth buffering)) — алгоритм який відповідає за створення зображень 3D-об'єктів спираючись на глибину елементів зображення. Зазвичай реалізується на апаратному рівні, іноді в програмному забезпеченні. Є одним з рішень проблеми видимості об'єктів та попіксельним узагальненням алгоритму художника.

При створенні (візуалізації) 3D-об'єкту, його глибина генерується на осі Z-координат і зберігається у Z-буфері. Сам буфер, зазвичай, являє собою двомірний масив X-Y координат із одним елементом (глибиною) для кожного екранного пікселя. Коли інший об'єкт сцени повинен бути відображений у цьому пікселі зараз, тоді порівнюється дві глибини та перекривається поточний піксель, якщо об'єкт знаходиться ближче до спостерігача. Обрана глибина зберігається в Z-буфері і замінює попередню. Зрештою, Z-буфер дозволяє правильно відтворювати звичне для нас сприйняття глибини: ближчий до нас об'єкт перекриває наступні, що розташовуються за ним — невидимих поверхонь.

Для Z-буферизації є критичним роздільна здатність буферу. Чим вона вища, тим краще відображаються глибина об'єктів сцени. Так, 16-розрядний буфер дозволяє порівняти за глибиною лише 64 тис. точок. Можуть з'явитися так звані артефакти (англ. z-fighting) — коли два об'єкти знаходяться дуже близько один до одного але мають однакову глибину. Тоді як Z-буфер на 24 розряди, має роздільну здатність 16 млн, 32 розряди — вже два мільярди.

Використання

[ред. | ред. код]

Z-буферизація дозволяє поєднувати 2D елементи у тривимірному просторі, створюючи декорації, а також складні ефекти такі як відображення різних типів поверхонь. Наприклад, 3D-редактор Maya дозволяє виконувати пост-рендеринг текстур для одного об'єкту, при цьому використовуючи кілька буферів на кшталт Z-буферу: α-буфер (α — коефіцієнт прозорості); ідентифікатор об'єкту; координати розгортки (англ. UV mapping) та будь-які інші координати необхідні для пост-обробки, економлячи при цьому час на моделювання, оскільки без їх використання потрібно-б було повторно створювати об'єкт. Z-буфер, містить дані для отримання рендерінгу (візуалізації) відображення поверхонь, дозволяє створювати тіні в scanline візуалізації, проектуючи Z-буфер вниз створюючи ефект тіні. Цей процес аналогічний до того, який називають не-трасовані промені (англ. non-raytracing) та використовують у безкоштовних та відкритих 3D-пакетах.

Еволюція

[ред. | ред. код]

При недостатньо великому ступені деталізації, можуть виникати проблеми з якістю. Коли значення відстані, що містяться у Z-буфері, нерівномірно розподілені на всій відстані. Ближчі значення завжди точніші і відображаються краще, ніж ті, які знаходяться далі. Як правило, це і потрібно, проте іноді це викликає артефакти зображення — коли дальній об'єкт перекривається ближнім. Z-буферизація, яка дозволяє точніше розподіляти зображення називають — W-буферизація. Кожна нова сцена спричинює очищення Z-буфера, щоб отримати нове значення, як правило — 1 або 0, оскільки ці значення є крайніми для визначення глибини (у шкалі від 0 до 1), тобто об'єкт присутній/не присутній в цій точці видимого простору. Винахід Z-буферизації пов'язують із іменем Едвіна Кетмелла, хоча сам процес вперше описав Волфган Штрассер (Wolfgang Straßer) у своїй дисертації 1974 року1.

На сучасних комп'ютерних 3D відеокартах, в процесі створення зображення, Z-буферизація використовує значний об'єм доступної пам'яті. Тому, одним із головних завдань для виробників обладнання стає зменшення використання пам'яті Z-буфером, не зменшуючи при цьому якості зображення. Так, одним із методом Z-Compression є стиснення й розпакування зображення буферу, оскільки воно займає менше пам'яті. Іншим методом є Fast Z-Clear швидке очищення Z-буфера. Після побудови і виведення зображення на екран, інформація, що розміщується у Z-буфері, вже неактуальна тому стирається. Z-буфер обнуляється, але вже не записуються окремі значення, а використовуються блоки які заміщають кілька значень одразу.

Відсікання невидимих поверхонь

[ред. | ред. код]
Перекриття об'єктів або англ. Z-fighting

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

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

Полігони послідовно закривають один одного.
  • полігони можуть перекривати один одного (трикутник А закриває В, В закриває С, С закриває А) і
  • неможливо визначити «найближчу» до глядача точку на трикутнику (наприклад, якщо сортувати трикутники за центроїдом, найближчою чи найвіддаленішою точкою, то все одно можлива ситуація, що А «ближчий» ніж В, але трикутник В повинен бути зображений першим).

Таким чином, алгоритм зворотної палітри не може бути використаним як альтернатива до процесу відсікання невидимих поверхонь, за винятком оптимізації. Для прикладу: для оптимізації ми можемо отримати полігони сортовані у X-Y координатах і Z — глибиною, що забезпечує межу, для швидкого визначення двох полігонів що можуть перекривати один одного.

Алгоритм

[ред. | ред. код]

Дано: список полігонів {P1, P2, …, Pn}

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

Введення:

note : z-depth and z-buffer(x, y) is positive...
           z-buffer(x,y)=max depth; and
           COLOR(x,y)=background color.


Початок

for : (each polygon P in the polygon list)
      do{
          for(each pixel(x,y) that intersects P) 
          do{
               Calculate z-depth of P at (x,y)
               If (z-depth < z-buffer[x,y]) 
               then{
                      z-buffer[x,y]=z-depth;
                      COLOR(x,y)=Intensity of P at(x,y);
                   }
            }
        }
  display COLOR array.

Математика

[ред. | ред. код]

Діапазон значень глибини в просторі (3D проєкція) візуалізація значень, таких як близько і далеко та значенням . Після перетворення, проєкція перспективи змінюється на нові значення з на , це визначається за формулою: Після цього проєкція отримує нові значення , або визначається за формулою: якщо, має старе значення у просторі її часто називають або . Отримані значення урівнюють між значенням −1 та 1, де значення площини від −1 та площина, яка дорівнює 1. Значення за межею цього діапазону є точкам невидимого простору, тому не відображаються.

Як правило, всі значення зберігаються у Z-буфері відеокарти в форматі фіксованої точки. Спочатку їх приводять до більш загальних значень [0,1] шляхом заміни відповідних перетворень згідно попередньої формули:

Наступним кроком, згідно наведеної вище формули, є множення де d — глибина Z-буфера (зазвичай 16, 24 чи 32 біти), отриманий результат округлюється до цілого числа:[1]

Ця формула може бути оберненою і утворює у розрахунках Z-буфера так звану «зернистість», про яку говорилось вище. Оберненим до цього :

where

Роздільна здатність Z-буфера — термін коли точка огляду (камера) отримує додаткові значення результатів мінімальних змін і зберігає їх у Z-буфері як значення +1 чи −1. Тому роздільна здатність може бути розрахована з похідного as a function of :


Візуалізація тла об'єкта, являє собою by the above :

~

Це показує, що значення згруповані щільніше поруч з площиною — а далі, вже рідше; це дає змогу отримати більшу точність ближче до камери. Що менше співвідношення, тим менша точність заднього тла площини, оскільки частинки розміщуються занадто тісно вони стають причиною артефактів візуалізації у віддалених об'єктах.[2]

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

Див.також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. The OpenGL Organization. Open GL / FAQ 12 - The Depth buffer. Архів оригіналу за 20 червня 2010. Процитовано 1 листопада 2010.
  2. Grégory Massal. Depth buffer - the gritty details. Архів оригіналу за 3 серпня 2008. Процитовано 3 серпня 2008.

Джерела

[ред. | ред. код]

Note 1: see W.K. Giloi, J.L. Encarnação, W. Straßer. "The Giloi’s School of Computer Graphics". Computer Graphics 35 4:12–16.