Стенсил бафер![]() ![]() Стенсил бафер (енгл. Stencil buffer, од Stencil што значи шаблон, шара, прошарица) је појам из области рачунарске графике. Означава бафер помоћу којег се сваком пикселу рачунарски исцртаване слике може доделити ознака у виду броја. Ово означавање се потом може користити за контролу начина на који ће појединачни пиксели бити исцртавани. Лаички речено, стенсил бафер је у рукама програмера алатка попут шаблон-лењира у рукама техничког цртача. Основна разлика је у томе што програмер овај шаблон може да обликује неограничен број пута и како год то погодује потребама исцртавања сцене. Прву хардверску имплементацију је представио Силикон Графикс, на манифестацији SIGGRAPH `88. Хардверска подршка за стенсил бафер данас постоји у оба интерфејса заступљена у индустрији рачунарских игара: у OpenGL, од прве верзије, и у Direct3D, од верзије 6.0. Грађа и коришћењеСтенсил бафер обично дели исти меморијски простор са дубинским бафером (енгл. Depth Buffer, Z-Buffer), а обично је тај однос 24 бита за дубински + 8 бита за стенсил бафер или, раније чешће коришћено, 15 бита за дубински + 1 бит за стенсил бафер. Такође је присутна варијанта 24 + 4, где се од 32 бита 28 користи, а 4 игнорише.[1] И стенсил и дубински бафер су део фрејм бафера (енгл. Frame Buffer), заједно за бафером за боју (енгл. Color Buffer). Први чип доступан ширем тржишту, који је подржавао један бит за стенсил бафер, био је 3Dlabs-ов Permedia II. Битови додељени стенсил баферу се могу користити за репрезентацију бројевних вредности у опсегу [0, 2n-1], али и као n булових матрица (n је број додељених битова), од којих свака може да се користи за контролисање посебног дела сцене. Свака комбинација ова два начина коришћења расположиве меморије је такође могућа. Стенсил тестСтенсил тест или стенсилинг (енгл. Stencil test, Stenciling) се међу операцијама над фрагментима (енгл. per fragment operations) налази након алфа теста и пре дубинског теста. Овим распоредом се омогућује да одговарајући пиксели, чији би приказ стенсил тест ионако спречио, ни не стигну до дубинског теста. Тиме се штеди време обраде сцене. На сличан начин, алфа тест може спречити одговарајуће пикселе да стигну до стенсил теста. Сам тест се изводи над стенсил бафером како би се нека вредност у њему или изменила или употребила, а спроводи се кроз тзв. стенсил функцију и стенсил операције. Стенсил функција представља функцију којом се стенсил вредност одређеног пиксела пореди са задатом референтном вредношћу. Уколико је ово поређење логички тачно, стенсил тест пролази. У супротном не. Могуће стенсил функције су:
Притом, могућа реакција условљена резултатом поређења разликује три стања дубинског и стенсил бафера:
За сваки од ових случаја се може подесити другачија операција над испитиваним пикселом. Могуће стенсил операције су:
Следи шематски приказ стенсил пајплајна[6]: ![]() Следи опис ознака које већ нису поменуте:
У OpenGL се стенсил функција, референтна вредност и маска, тим редом, дефинишу функцијом glStencilFunc. У Direct3D се свака од ових компоненти подешава појединачно, помоћу методе SetRenderState уређаја који се тренутно контролише. Ова метода очекује по два параметра, од којих је први стање које се подешава а други његова вредност. Редом који је коришћен горе, ова стања се зову D3DRS_STENCILFUNC, D3DRS_STENCILREF и D3DRS_STENCILMASK.[7] Стенсил операције се у OpenGL подешавају функцијом glStencilOp која очекује три вредности у већ наведеном реду. Код Direct3D се, опет, свако стање посебно подешава методом SetRenderState. Три стања којима се могу доделити операције се зову D3DRS_STENCILFAIL, D3DRENDERSTATE_STENCILZFAIL и D3DRENDERSTATE_STENCILPASS.[7] ПрименеИако је спектар примена стенсил бафера прилично широк, може се навести неколико познатијих примена. Проблем дубинске борбе![]() Услед недовољне прецизности дубинског бафера, копланарни полигони који се налазе на малим растојањима, или се преклапају, бивају приказивани као два објекта са мноштвом неправилних пресека. Ти пресеци могу да варирају у зависности од положаја камере и других параметара, и да се јако брзо мењају. Ово се зове дубинска борба (енгл. Z fighting). Решења која могу да дају одређене резултате су:
Сви ови приступи проблему само смањују вероватноћу да ће до дубинске борбе доћи, и не гарантују дефинитивно решење у општем случају. Решење које укључује стенсил бафер се заснива на знању који полигон треба испред којег да стоји. По овоме се силуета предњег полигона уцртава у стенсил бафер. Након тога се задњи полигон црта само тамо где силуета није уцртана, а остатак сцене може да се црта нормално. Пример OpenGL имплементацијеПошто је ово уједно и најједноставнији пример, следи програмски кôд за OpenGL, који исцртава слику са доњег дела илустрације.
Приликом закључавања и откључавања других бафера, коришћене су вредности 0 и 1 уместо, редом, константи GL_FALSE и GL_TRUE, зарад краћег записа. РефлексијеРефлексија неке сцене се исцртава као њен одраз у односу на дату раван, коју одређује полигон на коме рефлексија треба да се осликава. Део овог проблема који се односи стенсил бафер је ограничавање приказа рефлектоване сцене само на тај полигон тј. постизање илузије да се одраз сцене само на њему одражава. Стенсил бафер то омогућава на следећи начин:
Уместо полигона, може се радити и о површи коју чини више некопланарних полигона. У том случају, ова површ се разбија на полигоне и сваки од њих се посматра као посебно огледало. Такође, овај пример помиње само савршена огледала, јер то не утиче на општост проблема. Део сцене који је означен као огледало се пре, током и након исцртавања рефлексије може дорађивати сваким другим алатом. Један даљи проблем је огледање једног огледала у другом. Исти овај поступак се може поновити за одразе свих оваквих огледала. Економично решење може бити да се одраз огледала у огледалу увек исцртава као нерефлективна површина. Раванске сенкеПриликом цртања раванских сенки, доминантна су два проблема:
Још један проблем, који може а не мора да наступи, у зависности од технике, је пројектовање више полигона на један део сенке, што резултује тамнијим и светлијим деловима једне исте сенке. Сва три проблема се могу решити геометријски, но због могућности да се хардверско убрзање директно употреби, далеко је елегантнија имплементација помоћу стенсил бафера:
Просторне сенкеСтенсил бафер имплементација цртања просторних сенки представља сваку сенку геометријским телом, које својом запремином обухвата део сцене који се налази у њој. Уколико неки део сцене припада овој запремини, није осветљен датим светлом, у супротном јесте. Овај проблем се усложњава са порастом броја светала, али се не осврће на број површина на које сенке падају. Постоји више решења проблема, али сва следе следећи алгоритам:
Сваки од ових пролаза претпоставља да му на располагању стоји чисти стенсил бафер. Како за сенке, ова техника се може користити и за осветљавање делова простора који се налазе под јаким светлом. На пример светлост рефлектора у тамној просторији са великим присуством прашине у ваздуху би видљиво осветљавала одговарајућу запремину простора. Остале применеЈедан даљи пример су такозване меке сенке, код којих прелаз између осветљеног и осенченог дела сцене није оштар. Наиме, један начин да се овај ефекат постигне стенсил бафером јесте да се запремина сенке умножи, а да се њене копије редом скалирају по геометријском низу са малим увећањем, нпр. 1,04. Центар скалирања може да буде тежиште полигона који представља врх запремине. Ово ће само по себи дати низ композитних сенки које дају жељени ефекат. Још једна примена обухвата поље визуелизације приликом моделирања техником конструктивне геометрије солида (енгл. Constructive Solid Geometry, CSG), где стенсил бафер, заједно са дубинским бафером, може успешно да решава проблеме Булових операција над солидима. Види јошРеференце
Литература
Спољашње везе
|
Portal di Ensiklopedia Dunia