Кіріспе
Компьютерлік графикадағы деректер буферінің түрі. Тереңдік буфері, сондай-ақ z буфері деп те аталады, компьютерлік графикада 3D кеңістіктегі нысандардың тереңдік ақпаратын белгілі бір көзқарастан көрсету үшін қолданылатын деректер буферінің түрі. Тереңдік сахнаның биіктік картасы ретінде сақталады, мұндағы мәндер камераға дейінгі қашықтықты көрсетеді, 0 – ең жақын нүкте. Кодтау схемасы кері болуы мүмкін, яғни ең үлкен сан камераға ең жақын мәнді білдіреді. Тереңдік буферлері дұрыс көпбұрыштардың басқаларын жабуын қамтамасыз етуге көмектеседі, соның арқасында көрініс дұрыс көрсетіледі. Z буферлеуді алғаш рет 1974 жылы Вольфганг Штрассер өзінің PhD диссертациясында, жасырылған нысандарды көрсетуге арналған жылдам алгоритмдерді сипаттағанда айтқан. Бір-бірін жабатын көпбұрыштарды анықтаудың ұқсас тәсілі – суретшінің алгоритмі, ол тиімділігі мен дұрыс емес нәтижелердің есебінен, мөлдір емес сахна элементтерін өңдеуге қабілетті. 3D рендерингтік құбыржолда объект экранға проекцияланғанда, проекцияланған экрандық кескініндегі фрагменттің тереңдігі (z мәні) буферде сақталған мәнмен салыстырылады (тереңдік тесті) және жаңа мән жақын болса, оны алмастырады. Бұл растерлеушімен бірге жұмыс істейді, ол түсті мәндерді есептейді. Растерлеуші шығарған фрагмент басқа фрагментпен жабылса, сақталмайды. Жарым-жартылай немесе толық жабылған мөлдірсіз нысандар немесе беттер бар суретті қарағанда, көрерменнен ең алыс және басқа нысандардың артында орналасқан нысандарды толық көру мүмкін емес (яғни кейбір беттер басқаларының артында жасырылады). Егер жабысып тұрған беттерді басқару механизмі болмаса, беттер бір-бірінің үстіне шығып, басқа нысандардың артында болуын ескермейді. Осы беттерді анықтау және жою жасырын беттер мәселесі деп аталады. Қайталануды тексеру үшін компьютер бірінші нысанға сәйкес пикселдің z мәнін есептеп, оны z буферіндегі сол пикселдің z мәнімен салыстырады. Егер есептелген z мәні z буферіндегі z мәнінен кішірек болса (яғни жаңа пиксел жақын болса), z буферіндегі ағымдағы z мәні есептелген мәнмен ауыстырылады. Бұл көріністегі барлық нысандар мен беттер үшін қайталанады (көбінесе параллель түрде). Нәтижесінде, z буфері әдеттегі тереңдікті қабылдауды дұрыс көрсетуге мүмкіндік береді: жақын нысан алыстағыны жасырады. Бұл z-іріктеу деп аталады. Z буферінің ішкі құрылымы сурет сияқты, атап айтқанда 2D массив, бірақ ол әр экран пикселі үшін бір ғана мәнді сақтайды, ал түсті суреттер түсті құру үшін 3 мәнді қолданады. Сондықтан z буфері қара және ақ болып көрінеді, себебі ол түс туралы ақпаратты сақтамайды. Буфердің өлшемдері экран буферімен бірдей болып келеді. Бастапқы көрінуді тексеру (мысалы, артқы бетін кесу) және екінші деңгейдегі көрінуді тексеру (мысалы, жапсарлас тексерулер және экранды кесу) көбінесе рендерингке қажет емес белгілі бір көпбұрыштарды өткізіп жіберу үшін нысандардың көпбұрыштарында жүргізіледі. Z буфері салыстырмалы түрде қымбат, сондықтан бастапқы және екінші деңгейдегі көрінуді тексеру z буферін кейбір жұмыстан босатады. Z буферінің түйіршіктілігі көрініс сапасына үлкен әсер етеді: дәстүрлі 16 биттік z буфері екі нысан бір-біріне өте жақын болғанда артефактілерге (z ұрысы немесе тігіс деп аталады) әкелуі мүмкін. Қазіргі заманғы 24 биттік немесе 32 биттік z буфері жақсырақ жұмыс істейді, бірақ бұл мәселені қосымша алгоритмдерсіз жою мүмкін емес. 8 биттік z буфері өте аз дәлдікке ие болғандықтан, көбінесе қолданылмайды.
A depth buffer, also known as a z buffer, is a type of data buffer used in computer graphics to represent depth information of objects in 3D space from a particular perspective. The depth is stored as a height map of the scene, the values representing a distance to camera, with 0 being the closest. The encoding scheme may be flipped with the highest number being the value closest to camera. Depth buffers are an aid to rendering a scene to ensure that the correct polygons properly occlude other polygons. Z buffering was first described in 1974 by Wolfgang Straßer in his PhD thesis on fast algorithms for rendering occluded objects. A similar solution to determining overlapping polygons is the painter's algorithm, which is capable of handling non opaque scene elements, though at the cost of efficiency and incorrect results. In a 3D rendering pipeline, when an object is projected on the screen, the depth (z value) of a generated fragment in the projected screen image is compared to the value already stored in the buffer (depth test), and replaces it if the new value is closer. It works in tandem with the rasterizer, which computes the colored values. The fragment output by the rasterizer is saved if it is not overlapped by another fragment. When viewing an image containing partially or fully overlapping opaque objects or surfaces, it is not possible to fully see those objects that are farthest away from the viewer and behind other objects (i. e., some surfaces are hidden behind others). If there were no mechanism for managing overlapping surfaces, surfaces would render on top of each other, not caring if they are meant to be behind other objects. The identification and removal of these surfaces are called the hidden surface problem. To check for overlap, the computer calculates the z value of a pixel corresponding to the first object and compares it with the z value at the same pixel location in the z buffer. If the calculated z value is smaller than the z value already in the z buffer (i. e., the new pixel is closer), then the current z value in the z buffer is replaced with the calculated value. This is repeated for all objects and surfaces in the scene (often in parallel). In the end, the z buffer will allow correct reproduction of the usual depth perception: a close object hides one further away. This is called z culling. The z buffer has the same internal data structure as an image, namely a 2D array, with the only difference being that it stores a single value for each screen pixel instead of color images that use 3 values to create color. This makes the z buffer appear black and white because it is not storing color information. The buffer has the same dimensions as the screen buffer for consistency. Primary visibility tests (such as back face culling) and secondary visibility tests (such as overlap checks and screen clipping) are usually performed on objects' polygons in order to skip specific polygons that are unnecessary to render. Z buffer, by comparison, is comparatively expensive, so performing primary and secondary visibility tests relieve the z buffer of some duty. The granularity of a z buffer has a great influence on the scene quality: the traditional 16 bit z buffer can result in artifacts (called "z fighting" or stitching) when two objects are very close to each other. A more modern 24 bit or 32 bit z buffer behaves much better, although the problem cannot be eliminated without additional algorithms. An 8 bit z buffer is almost never used since it has too little precision.
Қолданылуы
Z буфері – дерлік барлық қазіргі заманғы компьютерлерде, ноутбуктерде және ұялы телефондарда 3D компьютерлік графиканы іске асыру үшін қолданылатын технология. Қазіргі таңда оның негізгі қолданысы – 3D көріністерді жылдам және дәл өңдеуді қажет ететін бейне ойындар. Z буфері тұтынушы графикалық карталарында аппараттық деңгейде іске асырылады. Сонымен қатар, Z буфері фильмдерге компьютерлік арнайы эффекттер жасау үшін де қолданылады (аппараттық емес, бағдарламалық жасақтама ретінде іске асырылады). Бұдан әрі, жарық нүктесінен бетті көрсетуден алынған Z буферінің деректері көлеңке карталау техникасы арқылы көлеңкелер жасауға мүмкіндік береді.
Даму
Тіпті жеткілікті мөлшерде түйіршіктілік болса да, z буферінің қашықтық мәндерінің дәлдігі қашықтық бойынша біркелкі таралмаған жағдайда сапа мәселелері туындауы мүмкін. Жақын мәндер алыстағы мәндерге қарағанда әлдеқайда дәл (соның салдарынан жақын нысандарды жақсырақ көрсетуге мүмкіндік береді). Әдетте, мұндай жағдай қалыпты, бірақ кейде нысандар алыстағанда артефакттар пайда болуына себеп болуы мүмкін. z буферлеудің дәлдігін біркелкі таратуды қамтамасыз ететін нұсқасы w буферлеу деп аталады (төменде қараңыз). Жаңа көрініс басталысында z буфері 1.0 мәніне дейін тазартылуы керек, өйткені бұл мән тереңдіктің жоғарғы шегін (0-ден 1-ге дейінгі шкалада) білдіреді, яғни көріс конусы арқылы ешқандай нысан жоқ. z буфері тұжырымдамасының авторы ретінде көбінесе Эдвин Катмулл аталса да, Вольфганг Страссер осы идеяны Катмуллдың өнертабысынан бірнеше ай бұрын, 1974 жылғы Ph.D. диссертациясында сипаттаған. Жаңа PC графикалық карталарында (1999–2005 жылдар) z буферін басқару қолданылатын жад енінің маңызды бөлігін пайдаланады. z буферлеудің өнімділік шығындарын азайту үшін әртүрлі әдістер қолданылды, мысалы, жоғалтусыз сығылу (сығымдау/декомпрессиялау үшін компьютерлік ресурстар, енінен арзан) және өте жылдам аппараттық z тазалау, бұл «бір кадр оң, бір кадр теріс» тәсілін ескірген етіп, кадрлар арасындағы тазалауды өткізіп жіберуге мүмкіндік береді (тереңдікті шеберлікпен тексеру үшін таңбаланған сандарды пайдалану). Кейбір ойындар, әсіресе N64 өмірлік циклының соңындағы ойындар, жад ені мен жад талаптарын азайту үшін Z буферлеуді азайтуға (мысалы, фонды Z буферсіз көрсету және тек алдыңғы план нысандары үшін Z буферді пайдалану) немесе оны толығымен болдырмауға шешім қабылдады. Super Smash Bros. және F Zero X – Z буферлеуді азайтып, кадр жылдамдығын арттырған екі N64 ойыны. Бірнеше Factor 5 ойындары да Z буферлеуді азайтты немесе алып тастады. N64-те Z буферлеуді пайдаланбағанға қарағанда 4 есе көп ені пайдаланылуы мүмкін. Mechwarrior 2 PC-де бастапқы 4 МБ 3DFX Voodoo-да Z буферлеуді пайдаланбағандықтан 800x600 дейінгі ажыратымдылықты қолдады.
Z-қару
Рендерингте z-іріктеу – тереңдікке негізделген пикселдерді ерте жою әдісі, жасырын беттерді көрсетудің қиынға түсуі өнімділіктің төмендеуіне әкелетін жағдайларда тиімділікке қол жеткізуге мүмкіндік береді. Бұл z-буферлеудің тікелей салдары болып табылады, онда әр пиксел кандидатының тереңдігі, оны жасырып тұрған геометрияның тереңдігімен салыстырылады. z-буферді пайдаланғанда, пикселдің тереңдігі белгілі болған кезде оны іріктеуге (жоюға) болады, бұл көрінбейтін пикселді жарықтандыру және текстуралау процесін өткізіп жіберуге мүмкіндік береді. Сондай-ақ, іріктелген пикселдер үшін ресурстарды көп қажет ететін пикселдік шейдерлер орындалмайды. Осылайша, z-іріктеу fillrate, жарық, текстура немесе пикселдік шейдерлер негізгі шектеулер болып табылатын жағдайларда жақсы оңтайландыру опциясы болып табылады. z-буферлеу геометрияны ретсіз қалдыруға мүмкіндік берсе, тереңдік бойынша көпбұрыштарды сұрыптау (яғни кері суретші алгоритмін қолдану) әрбір экран пикселінің азайтылған санымен көрсетілуін қамтамасыз етеді. Бұл fillrate шектеулі және үлкен мөлшерде қайта жабылатын көріністерде тиімділікті арттыра алады, бірақ z-буферлеумен біріктірілмесе, мынадай мәселелерге ұшырайды: көпбұрыштар цикл бойында бір-бірін жабуы мүмкін (мысалы: үшбұрыш А, B-ні, B, C-ні, C, A-ны жабады), сондай-ақ үшбұрышта "ең жақын" нүкте болмайды (мысалы: үшбұрыштарды ортасы, ең жақын немесе ең алыс нүктесі бойынша сұрыптаудың маңызы жоқ, әрқашан А және B үшбұрыстарын табуға болады, мұнда А "жақынырақ", бірақ шындығында B бірінші болып салынуы керек). Осы себепті кері суретші алгоритмін Z-іріктеудің баламасы ретінде (қайта құруды қажет етпей) пайдалануға болмайды, тек Z-іріктеуді оңтайландыру үшін ғана қолдануға болады. Мысалы, оңтайландыру үшін көпбұрыштарды x/y координаталары және z тереңдігі бойынша реттеу арқылы шекараларды анықтауға болады, бұл екі көпбұрыштың жабылу әрекеттесуі мүмкін екенін анықтауға көмектеседі.
polygons might occlude one another in a cycle (e. g.: triangle A occludes B, B occludes C, C occludes A), and
there is no canonical "closest" point on a triangle (e. g.: no matter whether one sorts triangles by their centroid or closest point or furthest point, one can always find two triangles A and B such that A is "closer" but in reality B should be drawn first). As such, a reverse painter's algorithm cannot be used as an alternative to Z culling (without strenuous re engineering), except as an optimization to Z culling. For example, an optimization might be to keep polygons sorted according to x/y location and z depth to provide bounds, in an effort to quickly determine if two polygons might possibly have an occlusion interaction.
W-буфері
w буферін іске асыру үшін камера кеңістігіндегі немесе -тің бұрынғы мәндері буферде, әдетте, қалқыма нүкте форматында сақталады. Дегенмен, бұл мәндерді экран кеңістігінде төбелерден сызықтық интерполяциялауға болмайды – оларды көбінесе керілендіру, интерполяциялау және содан кейін қайта керілендіру қажет. Нәтижесіндегі , -тің керісінше, аралығында тең қадаммен орналасады. w буферінің керілендіруден толығымен қашқан реализациялары да бар. Z буфері немесе w буфері жақсырақ кескінді береді, бұл қолданысқа байланысты.