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

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

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

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

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

Використання[ред.ред. код]

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-culling)[ред.ред. код]

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

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

При використанні Z-буфера піксель відсікаються чи не відсікаються, як тільки стає відомою його глибина, це дозволяє уникнути процес текстурування й освітлення того пікселю, який ми не бачимо в сцені за будь яких обставин. До того-ж, значні ресурси системи, які були б потрібні при прорисовці піксельних шейдерів, як правило, не виконуються для відсічених пікселів. Це робить відсікання невидимих поверхонь хорошим кандидатом для оптимізації, в ситуаціях, коли швидкість текстурування, освітлення, або піксельних шейдерів є вузьким місцем. У той час, Z-буферизація дозволяє геометрії, сортувати полігони за рахунок збільшення глибини(при цьому використовує алгоритм зворотної палітри (англ. painter's algorithm) і дозволяє кожен піксель екрану показувати менший час. Це може збільшити продуктивність в швидких сценах, з великою кількістю перерисовок, але таке поєднання із 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 проекція) візуалізація значень, таких як близько \mathit{near} і далеко\mathit{far} та значенням z. Після перетворення, проекція перспективи змінюється на нові значення з z на z', це визначається за формулою: z'=
\frac{\mathit{far}+\mathit{near}}{\mathit{far}-\mathit{near}} +
\frac{1}{z} \left(\frac{-2 \cdot \mathit{far} \cdot \mathit{near}}{\mathit{far}-\mathit{near}}\right)
Після цього проекція отримує нові значення z, або z' визначається за формулою: z'=
2 \cdot \frac{{z} - \mathit{near}}{\mathit{far}-\mathit{near}} - 1
якщо, z має старе значення z у просторі її часто називають w або w'. Отримані значенняz' урівнюють між значенням −1 та 1, де \mathit{near} значення площини від −1 та \mathit{far} площина, яка дорівнює 1. Значення за межею цього діапазону є точкам невидимого простору, тому не відображаються.

Відображення нерухомої коми[ред.ред. код]

Як правило, всі значення зберігаються у Z-буфері відеокарти в форматі фіксованої точки. Спочатку їх приводять до більш загальних значень [0,1] шляхом заміни відповідних перетворень  z'_2 = \frac{\left(z'_1+1\right)}{2} згідно попередньої формули: z'=
\frac{\mathit{far}+\mathit{near}}{2 \cdot \left( \mathit{far}-\mathit{near} \right) } +
\frac{1}{z} \left(\frac{-\mathit{far} \cdot \mathit{near}}{\mathit{far}-\mathit{near}}\right) + 
\frac{1}{2}

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

z'=f\left(z\right)=\left\lfloor  \left(2^d-1\right) \cdot \left(
\frac{\mathit{far}+\mathit{near}}{2 \cdot \left( \mathit{far}-\mathit{near} \right) } +
\frac{1}{z} \left(\frac{-\mathit{far} \cdot \mathit{near}}{\mathit{far}-\mathit{near}}\right) + 
\frac{1}{2} \right) \right\rfloor

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

z=
\frac{- \mathit{far} \cdot \mathit{near}}{\frac{z'}{S}\left(\mathit{far} - \mathit{near}\right) - {far}} 
=
\frac{- \mathit S  \cdot {far} \cdot \mathit{near}}{z'\left(\mathit{far} - \mathit{near}\right) - {far} \cdot S }

where S=2^d-1

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


\frac{dz}{dz'}=
\frac{-1 \cdot -1 \cdot \mathit S  \cdot {far} \cdot \mathit{near}}
     {\left( z'\left(\mathit{far} - \mathit{near}\right) - {far} \cdot S \right)^2}
\cdot \left(\mathit{far} - \mathit{near}\right)

Візуалізація тла об'єкта, являє собою z' by the above f\left(z\right): \frac{dz}{dz'}=
\frac{-1 \cdot -1 \cdot \mathit S  \cdot {far} \cdot \mathit{near} \cdot \left(\mathit{far} - \mathit{near}\right)}
     {\left( \mathit S  \cdot \left(\frac{-\mathit{far} \cdot \mathit{near}}{z} + \mathit{far}\right) - {far} \cdot S \right)^2} =


\frac{ \left(\mathit{far} - \mathit{near}\right) \cdot z^2 }{ S \cdot \mathit{far} \cdot \mathit{near} }=


\frac{z^2}{S \cdot \mathit{near}}-\frac{z^2}{S \cdot \mathit{far} }=

~ 
\frac{z^2}{S \cdot \mathit{near}}

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

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

Див.також[ред.ред. код]

Примітки[ред.ред. код]

  1. The OpenGL Organization. «Open GL / FAQ 12 - The Depth buffer». Процитовано 2010-11-01. 
  2. Grégory Massal. «Depth buffer - the gritty details». Процитовано 2008-08-03. 

Джерела[ред.ред. код]

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.